![](/img/trans.png)
[英]Defining global constexpr variables in anonymous namespace the same as making them inline?
[英]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
意味着const
和const
在命名空间级别意味着内部链接,但不适用于变量模板。 这似乎在标准中未得到充分说明。 目前的草案有以下内容
注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.