В чем разница между статическими объектами, определенными в заголовочном файле, и статическими объектами, определенными в файле cpp? - PullRequest
0 голосов
/ 22 июня 2019

Скажем, у меня есть файл заголовка, и предположим, что макросы дублирования позаботятся о: 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.Следовательно, компоновщик находит только один статический объект obj, созданный в файле cpp, и каждый модуль перевода, который ссылается на файл .h, получает этот символ?

Это правильная интуиция в отношении того, что происходит или существуетбольше в игре здесь?

1 Ответ

0 голосов
/ 22 июня 2019

Итак, если a.cpp, b.cpp и ch включают этот заголовок, объект obj будет создан 3 раза?

Приложение не будет связываться.В конце концов вы получите ошибку компоновщика дублирующейся функции.

Во втором случае у вас есть только один объект.

В любом случае правильным будет либо иметь все ваши определения в файлах .cpp, либо определить ваши функции как inline взаголовочные файлы, поэтому они определяются только один раз, независимо от того, сколько раз они включены.

...