所以我知道在C ++常量中,默认情况下,获得的变量与变量不同。这就是我不能放
的原因int foo;
在某个标题中 - 链接器会正确地抱怨multiple definitions。 OTOH,我可以写
const int bar = 42;
在标题中,编译器确保bar
只有一个定义。
使用积分常量,很容易看出编译器如何处理这个问题 - 至少只要没有人获取bar
的地址或做其他有趣的事情就要求它为它分配存储空间。但是,如果有人怎么办?如果它不是一个整体但是需要在运行时执行代码的东西呢?假设我将其放入标题中:
const std::string baz = "h2g2";
假设没有小的字符串优化,这需要在运行时分配动态内存,因此需要执行代码,地址需要存储在某处等等。
我假设我最终会得到每个翻译单元baz
的一个定义,只是编译器为其分配内部链接以防止链接器抱怨?或者我错过了什么?
注意:我 对constexpr
不感兴趣,只是在普通的旧C ++常量中,因为它们自80年代以来就存在并在C ++ 98中编纂。 (但是,如果一个全面的答案将包括如何与 constexpr
相结合,我不会抱怨。)
答案 0 :(得分:4)
在C ++中将对象(在命名空间范围内)声明为const
,默认情况下会为其指定内部链接。
如果你声明(并因初始化而定义)
const std::string baz = "h2g2";
到标题中,每个翻译单元都会有一个静态链接的字符串。地址必须存储在每个翻译单元中(每个不同的非堆存储字符文字的不同地址 - 只读存储器)
编辑:作为C ++ 11的题外话constexpr
暗示const
,因为它意味着" 适合于常量表达式评估",因此它应该也有内部联系。 [注。 I'm not mentioning C++14]