说我有一个头文件,并假定复制宏已处理: f1.h:
Object& getObject() {
static Object obj;
return obj;
}
在包含此标头的任何位置,翻译单元将具有其自己的obj副本。那么,如果a.cpp,b.cpp和c.h包含此标头,则obj将被实例化3次?
现在,如果我有以下内容:
f2.h:
Object& getObject();
f2.cpp:
#include <f2.h>
Object& getObject() {
static Object obj;
return obj;
}
在这种情况下,将包含我的标题,但是该符号仅在cpp文件中创建。因此,链接器仅找到在cpp文件中创建的单个静态obj对象,并且引用.h文件的每个翻译单元都会获得该符号?
这是关于正在发生的事情的正确直觉还是在这里还有更多发挥作用?
答案 0 :(得分:0)
因此,如果a.cpp,b.cpp和c.h包含此标头,则obj将为 实例化3次?
该应用程序不会链接。最终,您将得到重复的函数链接器错误。
在第二种情况下,您只有一个对象。
无论如何,正确的方法是将所有定义都保存在.cpp文件中,或者将函数定义为头文件中的inline
,因此无论包含多少次,它们都只能定义一次。 / p>