2017-09-23 3 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

メークファイルは他のファイルと同じディレクトリにあります。完全なエラーは、 'foo'のデータ型の相反するタイプです。1:note: 'foo'の前の宣言はここにありました。 –

答えて

1

data.hにおけるfooの署名が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ファイルにインクルードされるので、同じ2つの関数宣言が貼り付けられます。ヘッダーファイルを変更してください。

#ifndef DATA_H 
#define DATA_H 

char foo(char); 

#endif 
+1

一般的には良い考えですが、これはなぜコンパイラがそれらが* different *だと思うかを説明するものではありません。 –

+1

それは関連性もありません。たとえガードを含まなくても、OPによって転記されたコードはそのままで動作します。 – WhozCraig

関連する問題