为什么在共享跨多个文件时不需要用"extern"装饰"const char*"
题
在阅读C++书籍时,我了解到要在多个文件中共享一个const变量/对象,我们需要在其中一个文件中定义一次const变量,并在使用它的每个源文件中声明它。例如,
在file1中。cpp,我们全局定义一个const int变量,如
extern const int ca = 100;
在file2中。cpp在我们使用它的地方,我们像这样声明这个变量
extern const int ca;
上述惯例对我来说非常有意义。但是,当涉及到const char指针时,我们不需要使用extern来定义它,并且它可以很好地跨多个文件共享。为什么会发生这样的事情?例如,
在file1中。cpp,我们全局定义一个const char指针变量,如
const char *cstr = "hello";
在file2中。cpp在我们使用它的地方,我们像这样声明这个变量
extern const char *cstr;
为了使我的问题更具体,为什么cstr可以在file2中使用。cpp即使它在file1中没有用"extern"装饰。cpp?
非常感谢
解决方案
问题是联系问题之一。当你定义一个变量在 命名空间范围,并且没有以前的声明 建立链接,如果对象不是外部链接 const,内部如果是。所以当你写:
int const ca = 100;
在源文件中,链接将是内部的,实体
(变量) ca
指将是唯一的那个翻译
单位。如果你写了:
int ca = 100;
链接将是外部的,所以一个
extern int ca;
在另一个翻译单元将引用相同的变量。
当然,当你写的时候:
char const* cstr = "hello";
你正在定义一个指针,它不是const(尽管它 指向const)。
当然,通常情况下,您会在标题中声明变量,
与 extern
, ,所以会有一个以前的声明,当你
定义变量,它是第一个声明
建立链接。
其他提示
extern用于使其明确表示语句“extern const char * cstr;”是一个声明而不是定义,CSTR在其他地方定义。如果你做了“const char * cstr;”编译器会将其解释为定义,并且您最终将有2个CSTr变量。
如果您在“const char * cstr=”hello“;我猜编译器忽略它,因为初始化意味着您实际上定义了变量。