#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()
{
....
}