2012-03-07 9 views
2

を生成しませんmakefile私はコンパイル警告/エラーを受け取りません。どうして?Cは、私は、次のファイルを持っている警告

+0

余分な楽しみのために、それを 'char * f =" \ xeb \ x1f \ x5e \ x31 \ xc0 \ x88 \ x46 \ x07 \ x89 \ x76 \ x08 \ x8d \ x4e \ x08 \ x89 \ x46 " "\ x0c \ x8d \ X56 \ x0c \ x89 \ XF3 \ XB0 \ X0B \ XCD \ X80 \ X31 \ XC0 \ X31 \ XDB \ X40 \ XCD" "\ X80 \ xe8 \ XDC \ XFF \ XFF \ XFF"。 ' – ninjalj

答えて

8

あなたはコンパイラに嘘をついたので...それはあなたを信頼しています。 main.cので

あなたは、コンパイラfは、関数(宣言/プロトタイプ)ですが、fは実際には、ある告げ、FC(定義で定義された長さ7の(変更不可能な)文字配列へのポインタ)。

コンパイラに嘘をつけないでください。

+0

コンパイラはシンボルがリンクステージで定義されているかどうかをチェックします。 –

+0

基本的にはい。同時に2つのファイルをコンパイルすると( 'gcc f.c main.c')、より完全な解析を行うことができます。 – pmg

+2

"宣言"と "定義"を区別する必要があります。 "宣言"では、あなたは言う:これは、それは私を信じて、私はあなたにそう言います。 「定義」では、実装/メモリを実際に提供します。 –

0

宣言を入れると、f(void);両方のファイルからインクルードするヘッダーファイルに書き込むと、コンパイルエラーが表示されます。あなたの現在のケースでは、コンパイルの賢さはすべて問題ありません。私はあなたがコンパイラfは関数である言ったGCCのmain.c部とLNの一部

2

を見逃すことはMakefileの

。ここで警告する必要があるタイプを記録する実装には義務はありません。 Gccはそうではありません。

回避策は、fの宣言をヘッダーに置き、エラーを明らかにする各翻訳単位に含めることです。