У меня есть базовый файл Core.h и многие другие файлы .cpp и .h, скажем - (a.cpp, a.h, b.cpp, b.h, c.cpp, c.h)

Теперь я включил файл Core.h во все файлы .h (то есть a.h, b.h и c.h). И в c.cpp я включаю файлы a.h и b.h. В результате файл Core.h включается два раза, и я получаю сообщение об ошибке

/tmp/ccq7z6jY.o: In function `fileID2fileName(int)':
/home/Core.h:20: multiple definition of `fileID2fileName(int)'
/tmp/cciNkoqe.o:/home/Core.h:20: first defined here
/tmp/ccravW4I.o: In function `fileID2fileName(int)':
/home/Core.h:20: multiple definition of `fileID2fileName(int)'
/tmp/cciNkoqe.o:/home/Core.h:20: first defined here
/tmp/ccdUjOEu.o: In function `fileID2fileName(int)':
/home/Core.h:20: multiple definition of `fileID2fileName(int)'
/tmp/cciNkoqe.o:/home/Core.h:20: first defined here
collect2: ld returned 1 exit status
c++
4
user3747190 20 Авг 2014 в 18:52
6
При включении охранников не будут исправлены функции, определенные в заголовке, имеющем несколько определений в программе. Ничто не мешает двум отдельным TU включать заголовок и затем связываться. Вы должны либо указать функцию внутренней связи, либо определить ее в файле реализации.
 – 
chris
20 Авг 2014 в 18:55
1
@chris: Это ответ ; пожалуйста, сделай это одним!
 – 
Lightness Races in Orbit
20 Авг 2014 в 19:08

1 ответ

Лучший ответ

Проблема не в охранниках: они не помогут в разных единицах перевода.

Вам необходимо:

  • определяйте свои функции по одному разу в файле .cpp и объявляйте их только в файле .h
  • определите их inline в своих заголовках
  • определите их static в своих заголовках

Как справедливо отмечает StackedCrooked, включение определения статической функции, но неиспользование ее приведет к соответствующему предупреждению компилятора.

14
Quentin 20 Авг 2014 в 21:02
Однако определение их как static может вызвать предупреждение компилятора о "неиспользуемой функции" (в тех единицах компиляции, где она не используется).
 – 
StackedCrooked
20 Авг 2014 в 19:01
Я не знал этого. Спасибо !
 – 
Quentin
20 Авг 2014 в 19:07