4 に答える
C89/90 にはまだ暗黙の int ルールがあるため、main()
と同等int main()
です。戻り値の型を省略することで、戻り値の型を暗黙的に として定義したことになりますint
。これをずさんだと考える人もいるかもしれませんが、厳密に準拠しています (つまり、実装定義、未定義、または未指定の動作を含まない)。
C99 では、暗黙のint
ルールが削除されたため、main()
定義されていません。ただし、コンパイラはShall
orShall not
句の違反に遭遇した場合にのみ「診断を発行する」必要があります。診断を発行した後もコンパイルを自由に続行できます。正確に診断を構成するものは実装定義です。そのため、gcc がこの点に準拠するために必要なのは、gcc が発行する警告が診断と見なされることを示すドキュメントだけです。
編集: int
C89/90 標準の「暗黙的」は、実際には単一の場所にある単一のルールではありません。いくつかの場所に広がっています。主なものは§6.5.2.1で、次のように書かれています:
--
int
、signed
、signed int
、または型指定子なし
これはリストの一部であり、リストの各行のすべての項目が同等と見なされるため、(特に禁止されていない限り) 型指定子がないことは (signed) を指定することと同等であると言えますint
。
関数パラメーターについては、別の仕様 (§6.7.1) があります。「宣言されていないパラメーターは型を持つint
」というものです。
これはある種のC90標準参照の間違いのようです。リンク先のドキュメントが実際のISOC90規格と同等かどうかはわかりません。
どうやら、この特定の問題は、何年にもわたって未定義から未指定、明確に定義されたものに変化しました。
「X3.J11ワーキンググループ用」のANSI-Cの初期ドラフトには、次のテキストがあります。
2.1.2.2ホスト環境
「プログラム終了」
main関数への最初の呼び出しからの戻りは、main関数によって返された値を引数としてexit関数を呼び出すことと同じです。main関数が値を指定しない戻りを実行する場合、ホスト環境に返される終了ステータスは未定義です。
制約違反の場合でも、C コンパイラが発行しなければならないのは「診断」だけです。その後、続行して実行可能プログラムを作成することができます。
その部分に注意してください: } が終了する... の場合、戻り値の型を省略した場合
いいえ、そうではありません。return exitStatus;
の末尾からを省略するとどうなるかを示していますmain()
。
** undefined ** および unspecified の標準の定義によると、返されるものはすべて正当な int 値であるため、不特定の値を与えると言うべきでしょうか。結果。
いいえ。それは、プログラムの戻りステータス コードがどうなるかわからないことを意味します。ただし、動作は未定義ではありません。プログラムは終了します。どのような結果コードを使用するかは、別の問題です。
[...] 警告のみが表示されます: 'main' の戻り値の型は 'int' ではありませんが、エラーではありませんか?
そんな感じで実装です。古い C (C89) では、また一部の新しいコンパイラでも、関数の戻り値の型を省略すると、そうであると見なされますint
(そのため、警告でさえ少し問題があるように見えます)。
swith --std=c99 を指定した gcc がこれに違反したのはなぜですか?
おそらくそうだ。を使用する場合を除いて、GCC は非準拠の実装-ansi -pedantic
であるため、理論的には、これらのフラグを使用せずにコンパイルされたプログラムの動作は未定義であることに注意してください。しかし、それは理論です...