2011-05-14 140 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(); 
} 

無論你要定義的函數內聯與否是,今天,所有關於您的方便和不是關於優化。哪個更容易?內聯函數幾乎總是比較容易開始(即原型和初始版本);如果需要的話,你可以隨時改變這個決定。

相關問題