繁体   English   中英

命名空间中的const全局变量

[英]const global variable in namespace

我知道static const class成员只能在头文件中初始化。 命名空间是否相同? 例如,写入是否有效:

namehuman.hpp

namespace namehuman
{
   string const human("human");
}

main.cpp

#include "namehuman.hpp"
cout << namehuman::human << endl;

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

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

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

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

...

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

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

我认为这将多次定义human ,因此可能会导致ODR违规(见下文)。 通常最好只在标题中声明它

extern const string human;

并将定义添加到实现文件中

string human("human");

关闭应用程序时,请注意初始化顺序fiasco和等效项。

当具有外部链接ODR的内联函数使用human时,可能会导致ODR违规。 我认为,由于这很容易做到并且没有办法防范它,最好在实现文件中定义常量字符串。

暂无
暂无

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

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