2012-01-15 46 views
-1

假設我有兩個函數定義的文件insert.c: 1.insert_after 2.insert_before錯誤在C程序衝突的類型XX XX的和以前的隱式聲明在這裏

的這些的定義FUNC是這樣的:

insert_after(arg1) 
{ 
    if(condition 1) 
    { ......... } 
    else 
    insert_before(arg1); 
} 

insert_before(arg) 
{ 
    if(condition 1) 
    { ......... } 
    else 
    insert_after(arg); 
} 

現在,如果這個文件insert.c包含在main.c中和insert_after函數被調用

# include "insert.c" 
int main() 
{ 
    insert_after(arg); 
    return 0; 
} 

在使用gcc編譯main.c,遇到以下錯誤:

相互矛盾的 'insert_before'

備忘類型:以前隱含的 'insert_before' 宣言在這裏

什麼在這裏是錯誤的,以及如何避免它?

+1

請發表您的實際代碼。你有相互矛盾的聲明,這可能意味着沒有原型,不正確的原型或錯別字。不可能用「僞代碼」告知 – Mat 2012-01-15 12:35:56

+1

那些不是函數定義。你錯過了參數類型。這是你正在編譯的* actual *代碼嗎? – 2012-01-15 12:36:32

+0

你可以在沒有錯誤的情況下編譯'insert.c' standalone嗎? – 2012-01-15 12:36:50

回答

1

這是因爲你沒有爲你的函數聲明原型。默認情況下,沒有原型的函數有一組未知的參數並返回一個int。但insert_before並非如此。

創建您聲明它們文件insert.h

#ifndef INSERT_H 
#define INSERT_H 

void insert_before(type_of_arg); 
void insert_after(type_of_arg); 

#endif /* INSERT_H */ 

,包括在insert.c頂部此文件。

您應該然後編譯:

gcc -Wall -Wstrict-prototypes -Wmissing-prototypes -o progname insert.c main.c 
1

創建一個.h文件並賦予這些函數prototypes(維基百科條目描述原型與您鏈接)。

.h文件將僅包含功能:

insert_before(arg); 
insert_after(arg); 

此外,你應該有一個返回類型和參數類型(例如void insert_before(char * arg);編譯器是真的類型檢查好後,它會爲你節省頭痛。

0

的問題是,你叫insert_before編譯器知道它之前,給他們合適的原型(在頭文件),幷包括兩個insert.c和main.c中

頭文件
0

主要問題是您尚未完全聲明功能。每個函數簽名應與返回變量類型開始,所有參數應該用類型來說明,即:

void insert_before(int arg) 
{ 
... 
} 

有兩個功能相互調用,您需要轉發聲明一個至少,但通常你可以爲你的所有功能做到這一點,並把它放在一個共同的.h文件中,該文件包含在使用該功能的源文件中。這些「前聲明」通常被稱爲函數原型,並期待這樣的:

void insert_before(int arg); 
void insert_after(int arg); 

縮進是一個真正的問題......這可能是SO張貼在,但在這裏張貼代碼的症狀也比較如果縮進,則可讀。另外,如果條件1在兩個函數中都是相同的,那麼你可能會有無限的遞歸調用,這將導致堆棧溢出。

相關問題