如何解决全局变量和 constexpr内联与否?
如果我有: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;
我是否冒着在 a.o 和 main.o 中多次定义变量 num 的风险?或者它被声明为内联?我应该将模板变量专业化放在 a.cpp 中吗?如果我将 a.hpp 包装到命名空间中会发生什么变化?
解决方法
我是否冒险在 a.o 和 main.o 中多次定义变量 num
?
你知道。对于非模板变量,命名空间级别的 constexpr
隐含 const
和 const
隐含内部链接,但不适用于变量模板。这似乎在标准中没有详细说明。目前的草案有以下内容
Note 1:具有 const
限定类型的实例化变量模板可以具有外部或模块链接,即使未声明 extern
。
在实验中,不同的编译器为它们提供了不同的链接。例如,对于 GCC 9.3.0 和 10.2.0 num<float>
具有内部链接:
nm -C a.o
...
0000000000000004 r num<float>
但是在 Clang 10.0.0 中它有外部链接:
nm -C a.o
...
0000000000000000 R num<float>
因此,如果您尝试在两个编译单元中包含 a.hpp
,您将收到 Clang 链接错误。
还是声明为内联?
不,需要显式 inline
。
如果我将 a.hpp 包装到命名空间中会发生什么变化?
我猜你在谈论一个未命名的命名空间。在这种情况下,每个编译单元都保证获得自己的(私有)副本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。