[英]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.