включение заголовочных файлов - PullRequest
2 голосов
/ 27 сентября 2011

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

я определил функцию в файле functions.h с именем

 void sayhi()
{
  cout<<"hi";
}

теперь я создал файл lines.h, функции которого были определены в файле lines.cpp ... в файле lines.cpp, я включил functions.h ... и использовал sayhi (); в конструкторе класса линий ... затем в mymain.cpp (содержащий int main) я снова включил functions.h и в main я вызвал sayhi ();

но когда я скомпилировал программу, в mymain.cpp обнаружилась ошибка, говорящая о том, что sayhi () уже определен в lines.obj ... можете ли вы указать, что я делаю неправильно ??

Ответы [ 2 ]

7 голосов
/ 27 сентября 2011

Что ж, решение состоит в том, чтобы объявить функцию в functions.h, а затем определить ее в functions.cpp, как задумано природой.

3 голосов
/ 27 сентября 2011

Создание вашей функции inline позволяет избежать этой проблемы множественного определения.

Попробуйте,

inline void sayhi()
{
  cout<<"hi";
}

Эта ссылка может быть вам полезна.

В частности, он ссылается на раздел 7.1.2 стандарта ISO C ++:

Встроенная функция должна быть определена в каждой единице перевода, в которой оно используется и должно иметь точно такое же определение в каждом случае (3,2).

именно поэтому обойдено правило одного определения .

...