在阅读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.cpp中没有用“extern”装饰?
非常感谢
答案 0 :(得分:0)
extern用于使其明确表示语句“extern const char * cstr;”是一个声明而不是定义,cstr在其他地方定义。如果你做了“const char * cstr;”编译器会将其解释为定义,并且最终会得到2个cstr变量。
如果你在“const char * cstr =”hello“;”上应用extern我想编译器会忽略它,因为初始化意味着你实际上是在定义变量。
答案 1 :(得分:0)
问题是联系之一。在中定义变量时 命名空间范围,并没有先前的声明 建立联系,如果对象不是外联系 const,内部如果是。所以当你写:
int const ca = 100;
在源文件中,链接将是内部和实体
(变量)ca
指的是该翻译所特有的
单元。如果你写了:
int ca = 100;
链接是外部的,所以
extern int ca;
在另一个翻译单元中会引用相同的变量。
当然,当你写:
char const* cstr = "hello";
你正在定义一个指针,它不是常量(尽管它是 指向const)。
当然,通常情况下,你要在标题中声明变量,
与extern
,所以当你有一个先前的声明
定义变量,它是第一个声明
建立联系。