2012-02-23 18 views
5

test.cプログラムGCCは宣言されていない機能に対して警告を発することについて矛盾しているのはなぜですか?</p> <pre><code>int main() { dummySum(1, 2); return 0; } void dummySum(int a, int b) { a + b; } </code></pre> <p>理由:<code>gcc -o test test.c</code>してコンパイルする場合は、次のいずれかがないのに対し、

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

int dummySum(int a, int b) { 
    return a + b; 
} 

...は、何の警告を生成しませんか?宣言されていない機能に直面したとき

+0

そうではありません。私はそれも考えました。 'int'と' void'は 'dummySum'の型を返します。 – mattjgalloway

+1

宣言されていない関数のデフォルトの戻り値の型はintです。 voidとして宣言すると、一致する関数は見つかりません。どちらの場合でも警告が表示されるように、より強力な警告チェックを使用すると(たとえば-Wall)、私は信じています。最初の投稿で – Joe

+1

が同じだった、あなたは正しいです。私は投稿を編集しました。申し訳ありません –

答えて

8

は、コンパイラは、引数の与えられた数(と思う)を受け入れ、int(私は確信している部分)を返す関数を想定しています。あなたの2番目のものはそうしないので、あなたは再定義の警告を受け取ります。

私は非常に迅速な前向きなスキャンに基づいて、C99(PDF link)がこれを削除したと信じています。しかし、GCCが(警告付きで)それらを許可するという大きな驚きはありません。私は


(すべての警告をオンにする)-Wallを使用することをお勧め...コンパイルに失敗し始めるだろうどのくらいのコードを想像することはできませんので、あなたはときに、追加情報の膨大な量は、(あなたが特定の警告をオフにすることができます取得しますが必要な場合は、が生成されていることには本当に良い理由があります。

+0

C99では 'implicit int'が削除されています。したがって、厳密なC99モードまたはC11モードでは、IMOはコンパイルしないでください。しかし、gccはそれをコンパイルして警告を出すだけです(両方に対して)。 –

+0

@ダニエルフィッシャー:面白い!実際には、私はC99を見て、それ以上に進んでいると思います。暗黙の関数宣言を完全に削除します。 (興味深いことに、序文には2つの項目が別々にリストされています。「暗黙的なint」と「暗黙の関数宣言の削除」)。私は、 "暗黙の' int' "ビットは宣言された関数を参照していますが、戻り値の型はまったくありません。 –

+0

おそらく、言語弁護士ではないので、型が宣言されていないために型が想定されるすべての状況に「暗黙のint」を使用する傾向があります。 –

2

関数が宣言される前に使用することはできません。

  • int

これを返し

パラメータ

  • の不特定の(しかし固定された)数を取る:関数宣言が表示されていない場合、実装は、関数は、そのC89で想定しています暗黙の関数宣言と呼ばれます。

    C99では、関数の暗黙の宣言が言語から削除されており、実装はソースコードの翻訳を自由に行うことができます。

  • 関連する問題

     関連する問題