为什么在共享多个文件时不需要用“extern”来装饰“const char *”

时间:2014-06-04 17:37:36

标签: c++ const

在阅读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”装饰?

非常感谢

2 个答案:

答案 0 :(得分:0)

extern用于使其明确表示语句“extern const char * cstr;”是一个声明而不是定义,cstr在其他地方定义。如果你做了“const char * cstr;”编译器会将其解释为定义,并且最终会得到2个cstr变量。

如果你在“const char * cstr =”hello“;”上应用extern我想编译器会忽略它,因为初始化意味着你实际上是在定义变量。

更多信息:http://en.wikipedia.org/wiki/External_variable

答案 1 :(得分:0)

问题是联系之一。在中定义变量时 命名空间范围,并没有先前的声明 建立联系,如果对象不是外联系 const,内部如果是。所以当你写:

int const ca = 100;

在源文件中,链接将是内部和实体 (变量)ca指的是该翻译所特有的 单元。如果你写了:

int ca = 100;

链接是外部的,所以

extern int ca;

在另一个翻译单元中会引用相同的变量。

当然,当你写:

char const* cstr = "hello";

你正在定义一个指针,它不是常量(尽管它是 指向const)。

当然,通常情况下,你要在标题中声明变量, 与extern,所以当你有一个先前的声明 定义变量,它是第一个声明 建立联系。