我可以在头文件中有这样的定义吗?
constexpr double PI=3.14;
在将包含在多个 cpp 文件中的头文件中包含此内容有什么问题吗?
我担心,因为它在标准中说这个 constexpr 有自己的内存,把它放在 header 中,并将 header 添加到几个 cpp 文件中,在内存中生成相同值的多个副本以及其他一些讨厌的问题。
我正在使用 C++11
原文由 mans 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
constexpr
impliesconst
andconst
on global/namespace scope impliesstatic
(internal linkage), which means that every translation unit including this header获得自己的PI
副本。只有在获取地址或对它的引用时才会分配该静态的内存,并且每个翻译单元中的地址将不同。That implied
static
forconst
variables was introduced specifically to useconst
instead of#define
in header files in C++ to define constants.如果没有static
如果该头文件包含在多个链接在一起的翻译单元中,则会出现 多个符号定义 链接器错误。在 C++17 中,您也可以将其
inline
,这样只有一个PI
如果地址或引用被占用(即不是static
)。inline
变量是在 C++17 中引入的,以允许在头文件中定义非常量变量的仅头库。constexpr
在静态数据成员上意味着inline
,所以inline
在那里是不必要的。换句话说,如果可能,您应该使用
constexpr
作为头文件中的常量,否则const
。如果您要求该常量的地址在任何地方都相同,请将其标记为inline
。