Несколько файлов нужна функция?

0

Скажем, у меня есть два файла a.cpp и b.cpp, и оба они используют функцию в c.hpp. Если я # включил "c.hpp" в a.cpp и b.cpp, я бы получил ошибку во время ссылки, говоря, что символ был определен дважды (поскольку защитники заголовков не препятствуют включению в несколько единиц перевода)

Итак, как я могу предоставить оба файла.cpp доступа к функции в c.hpp, не получая ошибку при связывании?

  • 2
    Что именно в c.hpp ? Просто прототип или тоже реализация? По вашему редактированию я предполагаю полную реализацию.
  • 1
    Только поместите объявление функции в заголовок. Поместите определение функции в c.pp
Показать ещё 11 комментариев
Теги:
organization

2 ответа

3
Лучший ответ

Для долгой функции вы хотели бы предоставить функции, в которой она принадлежит, и переместить реализацию в ее собственную CPP и только сохранить объявление в заголовке.

Если функция короткая, вы можете добавить ключевое слово inline:

inline void myfunction() ...

Это позволяет компилятору встроить функцию в каждую единицу перевода, избегая множественных определений.

  • 0
    Благодарю. Очевидно, функции getter / setter могут быть реализованы в заголовке без явного добавления встроенного ключевого слова. Относится ли то же самое к конструкторам / деструкторам? Могу ли я реализовать их в шапке, не делая их встроенными?
  • 0
    Любая функция-член класса, определенная в объявлении класса, является встроенной по умолчанию. Для свободных функций (не являющихся частью класса) или функций-членов, определенных вне класса, необходимо ключевое слово, если вы хотите, чтобы они интерпретировались таким образом. Это верно для конструкторов и деструкторов, как и любой другой метод.
1

В большинстве случаев заголовочный файл должен содержать только объявление функции, т.е. Заголовок функции. Определение функции (тело) должно содержаться в отдельном файле.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 файлы будут скомпилированы отдельно, а компоновщик будет обрабатывать остальные.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню