2011-05-14 141 views
1

我有一个包含3个文件的程序:从同一个项目中的两个C++文件调用一个函数

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已经定义”

...我做错了什么?

回答

1

该函数的定义,即其代码只能在一个地方给出。

头文件应该只包含事件函数的声明,并且实现函数的代码需要放在.c文件中。

例如

在event.h

void event(); 

,并在任何一个.c文件

- 可能是因为存在的main.c或other.c或可能是更好的一个单独的文件EVENT.C

void event() 
{ 
    printf("Hello\n"); 
} 
+0

谢谢 - 这是我要求的解决方案 – CaptainProg 2011-05-14 11:31:05

+3

“标题应该只包含事件函数的[**声明**] ...”。 *声明*和*定义*在C++中不是可互换的术语。你也可以使用术语*原型*。 – 2011-05-14 13:10:59

+0

@Emile - 是的,我知道 - 一个错字 - 我在第一行中得到了正确的答案,花了一些时间仔细检查,但错过了:) – Mark 2011-05-14 19:15:01

1

您不应该在event.h中定义event()。由于event.h包含在main.cother.c,中,因此它最终定义了两次。

你需要声明它event.h,与函数签名,如:

void event();

,并且将定义在event.c文件,你会把函数体。该功能仅在此event.c文件中定义,另外两个.c文件将只包含该声明。

1

我想你已经在event.h定义event(),像这样:

void event() 
{ 
.... 
} 

但在头你甲肝e到声明功能,然后定义它在.cpp所以你必须做到以下几点: 事件。^ h

// declaration 
void event(); 

event.cpp

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

你有两个选择:要么不要在标题定义功能,或者将其定义为内联。首先是覆盖在其他的答案,而后者是那么容易,因为在前面加上“内联”的功能定义:

inline 
void example() { 
    do_stuff(); 
} 

无论你要定义的函数内联与否是,今天,所有关于您的方便和不是关于优化。哪个更容易?内联函数几乎总是比较容易开始(即原型和初始版本);如果需要的话,你可以随时改变这个决定。

相关问题