2017-09-23 77 views
-1

我正在使用C生成文件,當它只有main.c和data.h,但只要我添加了一個函數頭到data.h和併爲該函數提供文件,該函數實際上定義了它在編譯時開始出錯的函數。使用頭文件和生成文件在C中函數的衝突的類型

我:

/* main.c */ 
#include "data.h" 
int main() { /* this is empty */ } 

/* data.h */ 
char foo(char); 

/* foo.c */ 
#include "data.h" 
char foo(char){ 
    ... 
} 

我得到的錯誤是conflicting types for 'foo'note: previous declaration of 'foo'

有人問過這個問題的其他人試圖使用一個函數之前,它被宣佈或沿着這些行的東西,但我似乎無法找到在這個例子中出現。

+3

什麼是實際的完整錯誤信息? – melpomene

+2

Makefile在哪裏? –

+0

makefile與其他文件位於同一目錄中。完整的錯誤是''foo'data.h'的衝突類型。1:注意:'foo'的前面聲明在這裏' –

回答

1

foodata.h簽名錯誤消息聽起來是不一樣的在foo.c

例如

char foo(char); 

char foo(char*); 

// missing return type may produce a different/additional warning/error, depending on the compiler 
foo(char); 

檢查衝突的聲明的具體位置和比較。

+0

我沒有data.c –

-1

您在頭文件中忘記了包含警衛。它被包含在兩個C文件中,所以你可以得到相同的兩個函數聲明。像這樣改變你的頭文件。

#ifndef DATA_H 
#define DATA_H 

char foo(char); 

#endif 
+1

雖然通常是一個好主意,但這並不能解釋爲什麼編譯器認爲它們是*不同*。 –

+1

它甚至不相關。即使沒有包括OP在內的守衛,OP所發佈的代碼也可以工作。 – WhozCraig