У меня есть базовый файл 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
1 ответ
Проблема не в охранниках: они не помогут в разных единицах перевода.
Вам необходимо:
- определяйте свои функции по одному разу в файле .cpp и объявляйте их только в файле .h
- определите их
inline
в своих заголовках - определите их
static
в своих заголовках
Как справедливо отмечает StackedCrooked, включение определения статической функции, но неиспользование ее приведет к соответствующему предупреждению компилятора.
static
может вызвать предупреждение компилятора о "неиспользуемой функции" (в тех единицах компиляции, где она не используется).
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.