当我声明并初始化一个const对象时。在编译单元之间共享全局const对象
// ConstClass.h
class ConstClass
{
};
const ConstClass g_Const;
而两个cpp文件包含此标头。
// Unit1.cpp
#include "ConstClass.h"
#include "stdio.h"
void PrintInUnit1()
{
printf("g_Const in Unit1 is %d.\r\n", &g_Const);
}
和
// Unit2.cpp
#include "ConstClass.h"
#include "stdio.h"
void PrintInUnit2()
{
printf("g_Const in Unit2 is %d.\r\n", &g_Const);
}
当我构建解决方案,没有链接错误,你会得到什么。如果g_Const是一个非const根本的类型!
PrintInUnit1()和PrintInUnit2()显示在两个编译单元中有两个独立的具有不同地址的“g_Const”,为什么?
==============
我知道如何解决它。(使用extern关键字来声明,并且在一个CPP文件中定义它。)
我想知道为什么我没有在这个示例中找到redfin链接错误。在命名空间范围
“只要它在某个cpp文件中定义过一次,它就没有关系,只要它在某个cpp文件中定义了即可。”,这是(迂回)不正确的。首先,语言规范没有任何源文件的概念,并且头和cpp之间没有区别。其次,在实践中,有两个(使用C++ 11三种)常规方法在头中定义这样一个常量,没有任何一个定义规则问题。 –
这是否解决了“初始化失败”?我可以从任何(其他)编译单元(例如'Unit2.cpp')访问变量,并确保它已被初始化(在Constant.cpp中)?如果它不能解决初始化问题,那么main可能会随机打印nullpt .... –