Skip to content
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

Closed
qsyttkx opened this issue Jun 23, 2021 · 10 comments
Closed

【static那些事】static还可以限定访问 #142

qsyttkx opened this issue Jun 23, 2021 · 10 comments

Comments

@qsyttkx
Copy link

qsyttkx commented Jun 23, 2021

除了文章所说的作用之外,static还有限定访问范围的作用(类似于匿名名字空间)。我个人认为static这个单词的含义并不容易联想到这个用途,所以希望作者可以把这个加上:

// source1.cpp
extern void sayHello();
const char* msg = "Hello World!\n";
int main()
{
    sayHello();
    return 0;
}

// source2.cpp
#include <cstdio>
extern char* msg;
void sayHello()
{
    printf("%s", msg);
}

G++对于上面两个代码文件是可以正常编译并且打印Hello World!,但如果给source1.cpp中的msg加上static,则会导致undefined reference to 'msg'的编译错误:

// source1.cpp
extern void sayHello();
static const char* msg = "Hello World!\n";
int main()
{
    sayHello();
    return 0;
}
@Light-City
Copy link
Owner

除了文章所说的作用之外,static还有限定访问范围的作用(类似于匿名名字空间)。我个人认为static这个单词的含义并不容易联想到这个用途,所以希望作者可以把这个加上:

// source1.cpp
extern void sayHello();
const char* msg = "Hello World!\n";
int main()
{
    sayHello();
    return 0;
}

// source2.cpp
#include <cstdio>
extern char* msg;
void sayHello()
{
    printf("%s", msg);
}

G++对于上面两个代码文件是可以正常编译并且打印Hello World!,但如果给source1.cpp中的msg加上static,则会导致undefined reference to 'msg'的编译错误:

// source1.cpp
extern void sayHello();
static const char* msg = "Hello World!\n";
int main()
{
    sayHello();
    return 0;
}

感谢 很不错!

@Aroundsun
Copy link

为什么会出现这样的的错误啊

@Aroundsun
Copy link

大佬,求解

@Xiang-Pan
Copy link

static 相当于限定于本文件的全局变量

@kobeHub
Copy link

kobeHub commented Aug 30, 2022

这里如果把const char* 替换为 const std::string 就会把 source1.cpp 的msg1限制在本文件内链接, 这里const就起到了限制访问的作用,如果要在source2.cpp 访问需要加上extern。所以为什么const char* 不需要加extern呢? 求大佬解答

是否因为const char* 本身是一个类型,相当于int, 所以它具有外部链接性,在所有文件内可见?但是const string 限制了string变量只有内部连接性,如果想令其具有外部链接性,必须加上extern?

// 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()); }

@sher12138
Copy link

这都啥啊,我人麻了, msvc 编译需要这样
// source2.cpp #include <cstdio> extern const char* msg; void sayHello() { printf("%s", msg); }

@LVooo
Copy link

LVooo commented Dec 12, 2022

这里source2.cpp的文件需要写成extern const char *msg,否则会报错

@jwee-star
Copy link

在类或结构体外使用static:当声明静态函数/变量时,只对当前cpp文件可见,其他cpp文件不可见(无法使用extern查找到),不会进行跨文件链接编译。

@ccc013
Copy link

ccc013 commented Mar 12, 2023

这里如果把const char* 替换为 const std::string 就会把 source1.cpp 的msg1限制在本文件内链接, 这里const就起到了限制访问的作用,如果要在source2.cpp 访问需要加上extern。所以为什么const char* 不需要加extern呢? 求大佬解答

是否因为const char* 本身是一个类型,相当于int, 所以它具有外部链接性,在所有文件内可见?但是const string 限制了string变量只有内部连接性,如果想令其具有外部链接性,必须加上extern?

// 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()); }

我想应该是 const char* msg定义的是一个指向常量字符串的普通指针,不是一个常量指针,所以它是有外部链接性的,在 source1.cpp里就不需要添加 extern,但 const string msg1 定义的就是一个 string 类型的常量对象了,需要添加 extern。

@wangzy0327
Copy link

限制在本文件内链接

除了文章所说的作用之外,static还有限定访问范围的作用(类似于匿名名字空间)。我个人认为static这个单词的含义并不容易联想到这个用途,所以希望作者可以把这个加上:

// source1.cpp
extern void sayHello();
const char* msg = "Hello World!\n";
int main()
{
    sayHello();
    return 0;
}

// source2.cpp
#include <cstdio>
extern char* msg;
void sayHello()
{
    printf("%s", msg);
}

G++对于上面两个代码文件是可以正常编译并且打印Hello World!,但如果给source1.cpp中的msg加上static,则会导致undefined reference to 'msg'的编译错误:

// source1.cpp
extern void sayHello();
static const char* msg = "Hello World!\n";
int main()
{
    sayHello();
    return 0;
}

请问这里为什么在source2.cpp里引用source1.cpp的外部声明变量用的是extern char *msg; 而不是extern const char *msg;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

10 participants