我们假设我有文件a.cpp b.cpp和文件c.h.两个cpp文件都包含c.h文件.头文件包含一堆const int定义,当我编译它们时,我没有错误,但我可以访问这些const,就像它们是全局变量一样.所以问题是,如果我有多个const定义以及这些const int具有类似全局的范围,为什么我不会得到任何编译错误?
解决方法:
这是因为命名空间范围内的const声明意味着内部链接.具有内部链接的对象仅在定义它的转换单元中可用.所以从某种意义上说,你在c.h中拥有的一个const对象实际上是两个不同的对象,一个是a.cpp的内部对象,另一个是b.cpp的内部对象.
换一种说法,
const int x = ...;
相当于
static const int x = ...;
而
int x;
类似于
extern int x;
因为命名空间范围内的非const声明意味着外部链接. (在后一种情况下,它们实际上并不等效.extern,以及显式指定外部链接,产生对象的声明,而不是定义.)
请注意,这是C特有的.在C中,const不会改变隐含的链接.原因是C委员会希望你能够写作
const int x = 5;
在标题中.在C中,包含多个文件的头将导致链接器错误,因为您将多次定义同一个对象.