标签:c compilation include header
我们假设我有文件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中,包含多个文件的头将导致链接器错误,因为您将多次定义同一个对象.
标签:c,compilation,include,header 来源: https://codeday.me/bug/20190729/1573860.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。