-
Notifications
You must be signed in to change notification settings - Fork 8.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【static那些事】static还可以限定访问 #142
Comments
感谢 很不错! |
为什么会出现这样的的错误啊 |
大佬,求解 |
static 相当于限定于本文件的全局变量 |
这里如果把 是否因为 // source1.cpp
#include <string>
extern void sayHello();
const char* msg = "Hello World!\n";
extern const std::string msg1 = "msg1";
int main()
{
sayHello();
return 0;
}
// source2.cpp
#include <cstdio>
#include <string>
extern char *msg;
extern std::string msg1;
void sayHello() { printf("%s %s", msg, msg1.c_str()); }
|
这都啥啊,我人麻了, msvc 编译需要这样 |
这里source2.cpp的文件需要写成extern const char *msg,否则会报错 |
在类或结构体外使用static:当声明静态函数/变量时,只对当前cpp文件可见,其他cpp文件不可见(无法使用extern查找到),不会进行跨文件链接编译。 |
我想应该是 const char* msg定义的是一个指向常量字符串的普通指针,不是一个常量指针,所以它是有外部链接性的,在 source1.cpp里就不需要添加 extern,但 const string msg1 定义的就是一个 string 类型的常量对象了,需要添加 extern。 |
请问这里为什么在source2.cpp里引用source1.cpp的外部声明变量用的是 |
除了文章所说的作用之外,static还有限定访问范围的作用(类似于匿名名字空间)。我个人认为static这个单词的含义并不容易联想到这个用途,所以希望作者可以把这个加上:
G++对于上面两个代码文件是可以正常编译并且打印
Hello World!
,但如果给source1.cpp
中的msg加上static
,则会导致undefined reference to 'msg'
的编译错误:The text was updated successfully, but these errors were encountered: