首页 > 解决方案 > 头文件中定义的静态对象和 cpp 文件中定义的静态对象有什么区别?

问题描述

假设我有一个头文件,并假设复制宏已得到处理:f1.h:

Object& getObject() {
    static Object obj;
    return obj;
}

在包含此标头的任何地方,翻译单元都将拥有自己的 obj 副本。那么,如果 a.cpp、b.cpp、ch 包含这个头文件,obj 会被实例化 3 次?

现在,如果我有以下内容:

f2.h:

 Object& getObject();

f2.cpp:

  #include <f2.h>
  Object& getObject() {
      static Object obj;
      return obj;
  }

在这种情况下,我的标头被包含在内,但符号仅在 cpp 文件中创建。因此,链接器只能找到在 cpp 文件中创建的单个静态 obj 对象,而每个引用 .h 文件的翻译单元都会获得该符号?

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

标签: c++staticlinkertranslation-unit

解决方案


那么,如果 a.cpp、b.cpp、ch 包含这个头文件,obj 会被实例化 3 次?

该应用程序不会链接。最终你会得到一个重复的函数链接器错误。

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

在任何情况下,正确的做法是将所有定义都放在 .cpp 文件中,或者将函数定义为inline头文件中,这样无论包含多少次,它们都只定义一次。


推荐阅读