非整型常量如何在c++中工作

How do non-integral constants work in C++?

本文关键字:c++ 工作 整型常量      更新时间:2023-10-16

所以我知道在c++中,默认情况下,常量与变量的联系是不同的。这就是为什么我不能把

int foo;
在某些头文件中

——链接器会抱怨有多个定义。噢,我可以写

const int bar = 42;

在头文件中,编译器确保只有一个bar的定义。

对于整型常量,很容易看到编译器如何处理这个问题——至少只要没有人获取bar的地址或做一些其他有趣的事情,要求它为它分配存储空间)。然而,如果有人这么做了呢?如果它不是一个整数,而是需要代码在运行时执行的东西呢?假设我将其放入标题中:

const std::string baz = "h2g2";

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

我想我会结束每个翻译单元的baz的一个定义,只有编译器分配内部链接到它,以防止链接器抱怨?还是我错过了什么?

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

在c++中声明一个对象(在命名空间范围内)为const,默认情况下为其分配内部链接。

如果你声明(和定义,因为初始化)

const std::string baz = "h2g2";

放入头文件中,每个翻译单元将有一个静态链接字符串。地址必须存储在每个转换单元中(每个不同的非堆存储的字符量都有不同的地址—只读内存)

编辑:作为c++ 11的题外话,constexpr暗示const,因为它意味着"适合常量表达式求值",因此它也应该有内部链接。(Nb。我没有提到c++ 14]