在头文件中使用 constexpr

新手上路,请多包涵

我可以在头文件中有这样的定义吗?

  constexpr double PI=3.14;

在将包含在多个 cpp 文件中的头文件中包含此内容有什么问题吗?

我担心,因为它在标准中说这个 constexpr 有自己的内存,把它放在 header 中,并将 header 添加到几个 cpp 文件中,在内存中生成相同值的多个副本以及其他一些讨厌的问题。

我正在使用 C++11

原文由 mans 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
1 个回答

constexpr implies const and const on global/namespace scope implies static (internal linkage), which means that every translation unit including this header获得自己的 PI 副本。只有在获取地址或对它的引用时才会分配该静态的内存,并且每个翻译单元中的地址将不同。

That implied static for const variables was introduced specifically to use const 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

原文由 Maxim Egorushkin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题