为什么我可以在包含const int且没有编译器错误的多个cpp文件中包含头文件?

tre*_*ree 3 c++ compilation header include

假设我有文件a.cpp b.cpp和文件ch两个cpp文件都包含ch文件.头文件包含一堆const int定义,当我编译它们时,我没有错误,但我可以访问这些const,就像它们是全局变量一样.所以问题是,如果我有多个const定义以及这些const int具有类似全局的范围,为什么我不会得到任何编译错误?

Joh*_*eek 5

这是因为const命名空间范围内的声明意味着内部链接.具有内部链接的对象仅在定义它的转换单元中可用.因此,在某种意义上说,一个const你有对象c.h实际上是两个不同的对象,一个内部a.cpp和一个内部b.cpp.

换一种说法,

const int x = ...;
Run Code Online (Sandbox Code Playgroud)

相当于

static const int x = ...;
Run Code Online (Sandbox Code Playgroud)

int x;
Run Code Online (Sandbox Code Playgroud)

类似于

extern int x;
Run Code Online (Sandbox Code Playgroud)

因为const命名空间范围内的非声明意味着外部链接.(在最后一种情况下,它们实际上并不等效.extern除了显式指定外部链接外,还会生成对象的声明,而不是定义.)

请注意,这是C++特有的.在C中,const不会改变隐含的链接.的原因这是,C++委员会希望你能写

const int x = 5;
Run Code Online (Sandbox Code Playgroud)

在标题中.在C中,包含多个文件的头将导致链接器错误,因为您将多次定义同一个对象.