Вызов функции из одного и того же файла заголовка из двух файлов C в одном проекте

#c #include

#c #включить

Вопрос:

У меня есть программа, состоящая из 3 файлов:

main.c; other.c и event.h

event.h имеет функцию с именем ‘event()’.

Я хотел бы вызвать функцию event () как из main.c, так и из other.c. В верхней части как main.c, так и other.c Я включаю строку

 #include "event.h"
  

… и в каждом из файлов .c у меня есть строки

 event();
  

Однако я получаю следующие ошибки компиляции (Visual C )

«неустранимая ошибка LNK1169: найден один или несколько многократно определенных символов»

«ошибка LNK2005: _event@16 уже определено в main.obj»

…Что я делаю не так?

Ответ №1:

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

 inline
void example() {
  do_stuff();
}
  

Хотите ли вы определить встроенную функцию или нет, сегодня все зависит от вашего удобства, а не от оптимизации. Что для вас проще? Начинать с встроенных функций почти всегда проще (т. Е. с создания прототипа и первых версий); вы всегда можете отменить это решение, если потребуется, позже.

Ответ №2:

Определение функции, т.е. ее код, может быть дано только в одном месте.

Заголовок должен включать только объявление функции события, а код, реализующий функцию, должен находиться в файле .c.

например

в event.h

 void event();
  

и в любом ОДНОМ файле .c — может быть либо main.c, либо other.c, или, возможно, лучше в отдельном файле event.c

 void event()
{
    printf( "Hellon" );
}
  

Комментарии:

1. Спасибо — это решение, которое мне требовалось

2. «Заголовок должен включать только [ объявление ] функции события …». Объявление и определение не являются взаимозаменяемыми терминами в C . Вы могли бы также использовать термин прототип .

3. @Emile — да, я знаю — опечатка — я получил правильное в первой строке и потратил время на двойную проверку, но пропустил 🙂

4. Да, вам нужно быстро ввести здесь, если вы хотите получить ответ раньше других. 🙂

Ответ №3:

Вы не должны определять event() в event.h . Поскольку event.h она включена как в main.c , так и other.c, в конечном итоге определяется дважды.

Вам нужно объявить это в event.h с сигнатурой функции, такой как:

void event();

И поместите определение в event.c файл, куда вы будете помещать тело функции. Функция будет определена только в этом event.c файле, а два других .c файла будут содержать только объявление.

Ответ №4:

Я полагаю, вы определили event() в event.h , вот так:

 void event()
{
 ....
}
  

Но в заголовке вы должны объявить функцию, а затем определить ее в .cpp, поэтому вам нужно сделать следующее:
event.h

 // declaration
void event();
  

event.cpp

 #include "event.h"
// implementation
void event()
{
 ....
}