命名空间中的const全局变量

Fun*_*nky 5 c++

我知道static const class成员只能在标题中初始化.名称空间是否相同?例如,写入是否有效:

namehuman.hpp

namespace namehuman
{
   string const human("human");
}
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include "namehuman.hpp"
cout << namehuman::human << endl;
Run Code Online (Sandbox Code Playgroud)

我想知道包括头文件在内的所有文件是否都有自己的string人工副本,或者人类是否是真正的全局变量(不会多次复制).为了避免每个包含文件的副本,我是否有义务使用extern

Vla*_*cow 6

常量具有内部联系.因此,任何包含带有常量定义的头的编译单元都将拥有自己的对象实例.

根据C++标准(3.5程序和链接)

3具有命名空间范围(3.3.6)的名称具有内部链接(如果它的名称)

...

- 一个非易失性变量,显式声明为const或constexpr,既未显式声明为extern,也未声明为具有外部链接; 要么

如果需要具有外部链接的常量,则必须使用说明符声明它extern,并在编译单元中定义它.