从同一项目中的两个C ++文件中调用同一头文件中的函数

时间:2011-05-14 10:47:23

标签: c++ include

我有一个由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中定义”

......我做错了什么?

4 个答案:

答案 0 :(得分:1)

您不应在event()中定义event.h。由于event.hmain.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();
}

今天是否要内联定义函数是关于您的便利性而不是关于优化。哪个更容易?内联函数几乎总是更容易开始(即原型和第一版);如果需要,你可以随时改变这个决定。