3

このコードでは:

int main(int a, int b)
{
    printf(" main(int, int) works \n\n");
    return 0;
}

の署名は でmainありmain(int, int)正常にコンパイルされます。なんで?

4

4 に答える 4

12

C 標準では非標準の署名を禁止していないためですmain(たとえば、C99 標準のセクション 5.1.2 を参照)。

-Wallただし、GCC でフラグ1を使用してコンパイルすると、次のようにエラーが発生することがわかります。

test.c:4: warning: second argument of 'main' should be 'char **'

標準環境と対話する (つまり、コマンドライン パラメーターを処理して終了ステータスを返す) ことを前提としています。その場合は、int main(int, char **)またはを使用する必要がありますint main(void)。それ以外を使用すると、引数の内容は未定義になります。


1. ideone.com でコンパイラ フラグを指定できるようにしてほしいです。

于 2012-06-16T15:06:42.153 に答える
3

C標準では、実装がmain(C99、§5.1.2.2.1/ 1:「プログラムの起動時に呼び出される関数の名前が付けられmainています。実装はこの関数のプロトタイプを宣言していません。」)のプロトタイプを提供することを特に禁止しています。プロトタイプは、(通常は)コードのコンパイルを停止するものです。

プロトタイプがなければ、関数に渡した引数が期待どおりであることを確認するのはあなた次第だった、古き良き時代のようにプログラミングに戻ります。ありがたいことに、の場合main、署名は非常によく知られているので、問題になることはめったにありません。

編集:ひどくやりたい場合は、実際には2つのintパラメーターを持つバージョンを使用することも可能であることに注意してください(ただし、この手法はC ++では禁止されています)。は自分自身を再帰的に呼び出すことができ、そのような場合、2つのパラメーターmainを渡すことができます/渡すことができます:int

int main(int a, int b) { 
     if (a == 2)
         main(2, 10);

     printf("%d, %d", a, b);
     return 0;
}

これは現状ではかなり役に立たないですが、一般的な考え方を示します-コマンドライン引数なしでプログラムを実行することが期待されます。その場合、a(通常呼び出すものを受け取るargc)通常は1(つまり、唯一の引数)になります渡そうとしているのは、argv [0]のプログラムの名前です)。この場合、他の値で自分自身を呼び出します。その場合、それらの値が出力されます。

公平を期すために、これは純粋に理論的なものにかなり近いものであり、確かに推奨されないことを付け加えておきます。最も一般的な実装で動作しますが、標準では保証されていません。これは、それが行うことを達成するためのばかげた、回りくどい方法ですが、少なくともほとんどの一般的なコンパイラでは、とにかく(ほとんど)可能ではありません。

于 2012-06-16T15:12:06.443 に答える
1

main の署名を指定するヘッダー ファイルがないため、エラーは報告されません。main の場合、コンパイラは通常、戻り値のみをチェックします (main のシグネチャの警告はコンパイラに依存します)。

于 2012-06-16T15:08:02.170 に答える
1
int main(int a, int b)

main 関数に渡される引数は常に

int main(int argc,char *argv[])

main は珍しい関数です。これはオペレーティング システムによって呼び出されます。C++ は多くのシステムで実行でき、C++ 標準は OS ライターに、その OS で実行されているプログラムに渡すデータを指示できないため、好きなパラメーターを任意のパラメーターに書き込むことができます。メイン関数とコンパイラはそれを受け入れます。

于 2012-06-16T15:08:32.327 に答える