4

私はc99標準で読みました:

-remove implicit function declaration,

-remove implicit int.

しかし、-pedanticを使用してc99モードでgccコンパイラでこのコードをコンパイルしようとすると

main(void){
    f(3);
    return 0;
}


int f(int a){
    ....
}

2つのエラーが予想されますが、2つの警告が表示されます。

-warning: return type defaults to ‘int’

-warning: implicit declaration of function ‘f’.

それらはc99のエラーではないでしょうか?

http://gcc.gnu.org/c99status.html どちらの状況でも、「完了」と書かれています。

ありがとう。

4

3 に答える 3

7

C標準では、構文規則または制約の違反を含む翻訳単位の診断が必要です。そのような診断が致命的である必要はありません。コンパイラは、ソースファイルの処理を自由に続行できます。結果の実行可能ファイルの動作は、存在する場合、未定義です。この規格では、警告と致命的なエラーを区別していません。

(コンパイラがソースファイルを拒否する必要#errorがあるのはディレクティブだけです。)

結論:Cをコンパイルするときは、警告を非常に真剣に受け止めてください。

于 2012-06-23T16:45:00.837 に答える
4

致命的なエラーを生成するためにコンパイラが必要だとは思いません。気になる場合に使用-Werrorしてください...

于 2012-06-23T16:29:51.250 に答える
4

2つのポイント:最初に、コンパイラーを標準に準拠させるために、特定のフラグのセットが必要になる場合があります(通常はそうなります)。

第二に、標準で必要なのは、エラーが発生した場合に実装が「診断」を発行することだけですが、診断であるかどうかを定義するのは実装次第です。必要に応じて、「警告」は診断であ​​ると言っても過言ではありません。診断が発行されると、コンパイルを終了するか、とにかくコードをコンパイルできます。

結論:それが何をしているのかは、その価値が何であれ、おそらく準拠するのに十分です。

于 2012-06-23T16:46:19.540 に答える