1

タイトルが示すように、このエラーの原因はわかっていますが、この状況でコンパイラがエラーを出す理由を知りたいです。

例:

main.c

void test(){
    test1();
}

void test1(){
   ...
}

コンパイラが宣言を読み取る前に test1() の呼び出しに到達するため、暗黙的な宣言の警告が表示されますが、これには明らかな問題があります (戻り値の型がわからないなど)。すべての関数宣言を取得するために渡してから、これらのエラーを削除してコードをコンパイルしますか? やり方はとても簡単に思えますし、他の言語で同様の警告を見たことはないと思います。

私が見落としているこの状況で、この警告に特定の目的があるかどうかは誰にもわかりませんか?

4

4 に答える 4

5

Cはかなり古い言語であり、1972年にさかのぼるので、これはメモリと速度の制約のために意図的なものだったと思います。

定義方法では、コンパイラはファイルを1回スキャンして、コンパイルに必要なすべてのものを知る必要があります。2パスを実行する必要があると、よりコストがかかるため、このルールは今日まで存続しています。

また、peoroが指摘したように、このルールにより、コンパイラー作成者の作業が楽になります。オートコンプリートのためのIDEの寿命は言うまでもなく、IDEの寿命も楽になります。

したがって、プログラムライターにとっての小さな煩わしさは、とりわけコンパイラライターやIDEメーカーの生活を楽にすることを意味します。

ああ、そうすればあなたのプログラムはより速くコンパイルされるでしょう。数百万のコードベースが手元にある場合は悪くありません。

于 2011-01-10T09:44:59.793 に答える
3

それがCの定義方法です。

シンボルを使用する前に宣言することを強制する、使用前に宣言するルールがあります。

これは主に、コンパイラの作業を楽にするためのものです。

于 2011-01-10T09:43:00.200 に答える
0

簡単な答え: C は古いからです。:-)

長い答え: C コンパイラとリンカは完全に分離されています。さまざまなソース ファイルでさまざまな関数を定義し、それらをリンクしている場合があります。この場合、test1別のライブラリ ソース ファイルで定義していたとします。コンパイラは、他のファイルをコンパイルするまでは知りません。またtest1、他のファイルを個別にコンパイルするため、コンパイル時にそれについて知ることはできませんtest。したがって、「はい、実際には別のtest1場所で定義された があり、ここにその署名があります」と伝える必要があります。そのため、通常、関数を使用する必要がある他のソース ファイルのヘッダー ファイル (.h) をこのファイルに含めます。

于 2011-01-10T09:47:48.373 に答える
0

そうは思えないかもしれませんが、このアプローチは時間の節約にもなります! 何千ものファイルを含むコンパイル ユニットをコンパイルしていると想像してください。このシナリオでは、コンパイラはまず何千ものファイルをペアリングしてから、「ああ、この関数は存在しません。中止します」と判断する必要があります。実装方法により、未定義の関数が見つかるとすぐにコンパイルが中断されます。これにより、時間を節約できます。

于 2011-01-10T09:53:00.383 に答える