Скажем, у меня есть два файла a.cpp и b.cpp, и оба они используют функцию в c.hpp. Если я # включил "c.hpp" в a.cpp и b.cpp, я бы получил ошибку во время ссылки, говоря, что символ был определен дважды (поскольку защитники заголовков не препятствуют включению в несколько единиц перевода)
Итак, как я могу предоставить оба файла.cpp доступа к функции в c.hpp, не получая ошибку при связывании?
Для долгой функции вы хотели бы предоставить функции, в которой она принадлежит, и переместить реализацию в ее собственную CPP и только сохранить объявление в заголовке.
Если функция короткая, вы можете добавить ключевое слово inline:
inline void myfunction() ...
Это позволяет компилятору встроить функцию в каждую единицу перевода, избегая множественных определений.
В большинстве случаев заголовочный файл должен содержать только объявление функции, т.е. Заголовок функции. Определение функции (тело) должно содержаться в отдельном файле.cpp. Поэтому в вашем случае это должно выглядеть так:
c.hpp:
int my_function(int x, int y);
c.cpp:
#include "c.hpp"
int my_function(int x, int y)
{
return x + y;
}
и добавьте #include "c.hpp"
в любой другой файл, в котором вы хотите использовать my_function
. Все.cpp файлы будут скомпилированы отдельно, а компоновщик будет обрабатывать остальные.
c.hpp
? Просто прототип или тоже реализация? По вашему редактированию я предполагаю полную реализацию.c.pp