我有一个由3个文件组成的程序:
main.c中; other.c和event.h
event.h有一个名为'event()'的函数。
我想从main.c和other.c调用event()函数。在main.c和other.c的顶部,我包括行
#include "event.h"
...在每个.c文件中我都有行
event();
但是我收到以下编译错误(Visual C ++)
“致命错误LNK1169:找到一个或多个多重定义的符号”
“错误LNK2005:_event @ 16已在main.obj中定义”
......我做错了什么?
答案 0 :(得分:1)
您不应在event()
中定义event.h
。由于event.h
和main.c
中都包含other.c,
,因此最终会定义两次。
您需要在event.h中使用函数签名声明它,例如:
void event();
将定义放在event.c
文件中,放置函数体。该函数仅在此event.c
文件中定义,另外两个.c
文件仅包含声明。
答案 1 :(得分:1)
函数的定义,即其代码只能在一个地方给出。
标题应该只包含事件函数的声明,实现该函数的代码需要在.c文件中。
e.g。
在event.h中
void event();
并且在任何一个.c文件中 - 可以是main.c或other.c,也可以是单独的文件event.c
void event()
{
printf( "Hello\n" );
}
答案 2 :(得分:1)
我想您已在event()
中定义了event.h
,如下所示:
void event()
{
....
}
但是在标题中你必须声明函数然后在.cpp中定义它所以你必须执行以下操作: 的 event.h 强>
// declaration
void event();
<强> event.cpp 强>
#include "event.h"
// implementation
void event()
{
....
}
答案 3 :(得分:1)
您有两种选择:要么不在标题中定义函数,要么将其定义为内联。第一个在其他答案中有所涉及,后者就像在函数定义中加上“内联”一样简单:
inline
void example() {
do_stuff();
}
今天是否要内联定义函数是关于您的便利性而不是关于优化。哪个更容易?内联函数几乎总是更容易开始(即原型和第一版);如果需要,你可以随时改变这个决定。