非整数常量如何在C ++中工作?

时间:2014-07-16 13:31:40

标签: c++ constants linkage c++98

所以我知道在C ++常量中,默认情况下,获得的变量与变量不同。这就是我不能放

的原因
int foo;

在某个标题中 - 链接器会正确地抱怨multiple definitions。 OTOH,我可以写

const int bar = 42;

在标题中,编译器确保bar只有一个定义。

使用积分常量,很容易看出编译器如何处理这个问题 - 至少只要没有人获取bar的地址或做其他有趣的事情就要求它为它分配存储空间。但是,如果有人怎么办?如果它不是一个整体但是需要在运行时执行代码的东西呢?假设我将其放入标题中:

const std::string baz = "h2g2";

假设没有小的字符串优化,这需要在运行时分配动态内存,因此需要执行代码,地址需要存储在某处等等。

我假设我最终会得到每个翻译单元baz的一个定义,只是编译器为其分配内部链接以防止链接器抱怨?或者我错过了什么?

注意: constexpr 不感兴趣,只是在普通的旧C ++常量中,因为它们自80年代以来就存在并在C ++ 98中编纂。 (但是,如果一个全面的答案将包括如何与 constexpr 相结合,我不会抱怨。)

1 个答案:

答案 0 :(得分:4)

在C ++中将对象(在命名空间范围内)声明为const,默认情况下会为其指定内部链接。

如果你声明(并因初始化而定义)

const std::string baz = "h2g2";

到标题中,每个翻译单元都会有一个静态链接的字符串。地址必须存储在每个翻译单元中(每个不同的非堆存储字符文字的不同地址 - 只读存储器)

编辑:作为C ++ 11的题外话constexpr暗示const,因为它意味着" 适合于常量表达式评估",因此它应该也有内部联系。 [注。 I'm not mentioning C++14]