为什么我可以在多个包含const int的cpp文件中包含一个头文件,而不会出现编译器错误
Why is it that I can include a header file in multiple cpp files that contains const int and not have a compiler error?
让我们假设我有文件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++标准。。。
7.1.1存储类别说明符
7) 在没有存储类说明符的命名空间作用域中声明的名称具有外部链接,除非它由于以前的声明而具有内部链接,并且前提是它没有声明为const声明为const和未显式声明为extern的对象具有内部链接
3.5程序和链接
2) 当一个名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他作用域的名称引用。
预处理器使在标题中定义的内容包含在当前翻译单元中。
执行此操作时,将在每个对象文件中为标头中的每个常量创建一个单独的const
变量。这不是问题,因为它们是const
。
#define
是邪恶的,需要死亡。
#define的某些用法可以用内联函数代替。一些-带有const
变量声明。由于#define往往在头文件中,因此用const
替换这些头文件会更好。因此,"consts在默认情况下是静态的"规则。
- C++系统找不到指定的文件错误
- C++语法头文件错误
- C++生成文件错误"implicit entry/start for main executable"
- C++/生成文件错误:未定义对"main"的引用
- VS2019:资源文件错误:中性(默认)(未知子语言:0x8)
- C++程序不制作文件(错误)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- "what does ":*** [可执行文件] 错误 1 " mean ?"
- 如何修复使用VScode调试器gcc调试时的"找不到文件"错误
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- Qt .exe文件错误
- c++ 添加具有写入文件错误的文本变量
- 无法转换 .CATPart 文件.错误:输入文件路径似乎包含不支持的字符
- 写入文本文件错误,QT
- C++写入文件错误
- Windows Subsystem for Linux (WSL) 下的间歇性随机"找不到文件"错误
- 犰狳读取MAT文件错误
- 无法求解FullPathForFilename:COCOS2DX中可能缺少文件错误
- C Wininet FTP列出了许多文件错误
- 生成文件错误 - 找不到文件 - *.cpp