私は最近、main 関数が 1 つの引数しかとらない C プログラムに出くわしました。これは C89 で合法ですか? gcc に問題はないようです。
私が思うに、署名は無視され、メインはmain(int,char**)
とにかく呼び出されますが、よくわかりません。
プログラムでは次のようになります。
main(argc) {
...
}
C89規格によると、それは合法ではありません。セクション2.1.2.2からホストされた環境:
プログラムの起動時に呼び出される関数の名前は`main`です。実装 この関数のプロトタイプを宣言していません。パラメータなしで定義できます。 int main(void){/ * ... * /} または2つのパラメータを使用します(ここではargcおよびargvと呼びますが、名前は任意です) それらは宣言されている関数に対してローカルであるため、使用できます): int main(int argc、char * argv []){/ * ... * /}
C99標準は、セクション5.1.2.2.1プログラムの起動で同じことを述べています。
はい、動作します†</sup>が、役に立ちません。
C では、型が指定されていない変数はデフォルトで に設定されることint
に注意してください。つまり、関数は次のように展開されます。
int main(int argc) {
...
}
これは C89 で合法です。ただし、ほとんどの場合、プログラムに送信された引数の数を知りたい場合は、おそらくそれらの引数の内容が必要になるため、これはほとんど役に立ちません。
ただし、GCC (でコンパイルした場合-Wall
) は警告を表示します。
「main」宣言のパラメーターは 1 つだけです。
このコードはほとんど役に立たないと言っているだけです。
ただし、技術的には、@ hmjd が指摘したように、これは未定義の動作であるという点で違法です。ただし、私が遭遇した C のほとんどの実装では、追加のパラメーターを関数に渡すと、ほとんどの場合無視されます。したがって、関数に送信される変数の量がオーバーフローした場合に問題となるシステムを使用していない限り、問題はありません。