tre*_*ree 3 c++ compilation header include
假设我有文件a.cpp b.cpp和文件ch两个cpp文件都包含ch文件.头文件包含一堆const int定义,当我编译它们时,我没有错误,但我可以访问这些const,就像它们是全局变量一样.所以问题是,如果我有多个const定义以及这些const int具有类似全局的范围,为什么我不会得到任何编译错误?
这是因为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中,包含多个文件的头将导致链接器错误,因为您将多次定义同一个对象.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |