头文件中定义的静态对象和cpp文件中定义的静态对象有什么区别?

时间:2019-06-22 12:30:48

标签: c++ static linker translation-unit

说我有一个头文件,并假定复制宏已处理: 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文件的每个翻译单元都会获得该符号?

这是关于正在发生的事情的正确直觉还是在这里还有更多发挥作用?

1 个答案:

答案 0 :(得分:0)

  

因此,如果a.cpp,b.cpp和c.h包含此标头,则obj将为   实例化3次?

该应用程序不会链接。最终,您将得到重复的函数链接器错误。

在第二种情况下,您只有一个对象。

无论如何,正确的方法是将所有定义都保存在.cpp文件中,或者将函数定义为头文件中的inline,因此无论包含多少次,它们都只能定义一次。 / p>