我有一个头文件test.hxx
,它将包含在多个翻译单元中。头文件如下:
namespace program_exec
{
static constexpr int DEFAULT_VAL = 0;
static constexpr char *name = "proc_exec";
}
我已将此头文件包含在多个翻译单元(* .cxx)中,并且工作正常。
但删除constexpr char*
的静态前方会导致链接错误,即如果我将static constexpr char *name = "proc_exec"
更改为constexpr char *name = "proc_exec";
我收到链接器错误,说
error: multiple definition of program_exec::name
但对整数进行相同的更改工作正常,即将static constexpr int = DEFAULT_VALUE;
更改为constexpr int = DEFAULT_VALUE;
。
区别在于移除static**
infront constexpr int
和constexpr char*
会产生什么影响?
请帮助我理解差异。非常感谢你提前。
[编辑]
将变量作为" 静态constexpr "在头文件中并在多个翻译单元中使用此头文件。每个翻译单元是否都有自己的变量副本(或)编译器是否通过优化它只保留一个副本?
因为在带有命名空间范围的头文件中使用静态变量具有内部链接,并且包含此头文件的任何转换单元都有自己的变量副本。
我的理解是否正确?