繁体   English   中英

全局变量和 constexpr(内联与否?)

[英]Global variables and constexpr (inline or not?)

如果我有:a.hpp a.cpp 和 main.cpp 包含 a.hpp,并且在 a.hpp 我写

template<typename T>
constexpr int num;
template<>
constexpr int num<float> = 1;
template<>
constexpr int num<double> = 2;

我是否冒着在 ao 和 main.o 中多次定义变量 num 的风险? 还是声明为内联? 我应该将模板变量特化放在 a.cpp 中吗? 如果我将 a.hpp 包装到命名空间中会发生什么变化?

我是否冒着在 ao 和 main.o 中多次定义变量num的风险?

你做。 对于非模板变量, constexpr意味着constconst在命名空间级别意味着内部链接,但不适用于变量模板。 这似乎在标准中未得到充分说明。 目前的草案有以下内容

1:具有const限定类型的实例化变量模板可以具有外部或模块链接,即使未声明extern也是如此。

实验上,不同的编译器给了它们不同的链接。 例如,对于 GCC 9.3.0 和 10.2.0 num<float>具有内部链接:

 nm -C ao.. 0000000000000004 r num<float>

但是对于 Clang 10.0.0 它具有外部链接:

 nm -C ao.. 0000000000000000 R num<float>

因此,如果您尝试在两个编译单元中包含a.hpp ,您将收到 Clang 的链接错误。


还是声明为内联?

不,需要显式inline

如果我将 a.hpp 包装到命名空间中会发生什么变化?

我猜你在谈论一个未命名的命名空间。 在这种情况下,每个编译单元都保证获得自己的(私有)副本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM