3

私は最近、main 関数が 1 つの引数しかとらない C プログラムに出くわしました。これは C89 で合法ですか? gcc に問題はないようです。

私が思うに、署名は無視され、メインはmain(int,char**)とにかく呼び出されますが、よくわかりません。

プログラムでは次のようになります。 main(argc) { ... }

4

2 に答える 2

5

C89規格によると、それは合法ではありません。セクション2.1.2.2からホストされた環境

プログラムの起動時に呼び出される関数の名前は`main`です。実装
この関数のプロトタイプを宣言していません。パラメータなしで定義できます。

    int main(void){/ * ... * /}

または2つのパラメータを使用します(ここではargcおよびargvと呼びますが、名前は任意です)
それらは宣言されている関数に対してローカルであるため、使用できます):

    int main(int argc、char * argv []){/ * ... * /}

C99標準は、セクション5.1.2.2.1プログラムの起動で同じことを述べています。

于 2012-06-29T13:30:23.570 に答える
3

はい、動作します†</sup>が、役に立ちません。

C では、型が指定されていない変数はデフォルトで に設定されることintに注意してください。つまり、関数は次のように展開されます。

int main(int argc) {
    ...
}

これは C89 で合法です。ただし、ほとんどの場合、プログラムに送信された引数の数を知りたい場合は、おそらくそれらの引数の内容が必要になるため、これはほとんど役に立ちません。

ただし、GCC (でコンパイルした場合-Wall) は警告を表示します。

「main」宣言のパラメーターは 1 つだけです。

このコードはほとんど役に立たないと言っているだけです。

ただし、技術的には、@ hmjd が指摘したように、これは未定義の動作であるという点で違法です。ただし、私が遭遇した C のほとんどの実装では、追加のパラメーターを関数に渡すと、ほとんどの場合無視されます。したがって、関数に送信される変数の量がオーバーフローした場合に問題となるシステムを使用していない限り、問題はありません。

于 2012-06-29T13:29:00.510 に答える