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

我们假设我有文件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中,包含多个文件的头将导致链接器错误,因为您将多次定义同一个对象.

上一篇:通过主ANT构建文件构建多个android项目


下一篇:Qt – Linux的编译不是针对Android的编译?为什么?