-2

このコードはC標準(C89、C99、C10xなど)に準拠していますか?

void 
main(int a,int b, int c, int d,char *msg){
    if(d==1){
        printf("%s\n",msg);
    }else{
        main(1,2,3,1,&"Hello Stackoverflow");
    }
}

そうでない場合、なぜですか?

4

3 に答える 3

8

エラーが1つあります。&"Hello Stackoverflow"タイプがないchar*ため、そのタイプを期待する関数にそれを渡さないでください。

それとは別に、このプログラムは実装固有の拡張として標準で許可されていますが、コンパイラはそれを拒否する自由があります。

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

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

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

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

または同等のもの; または他の実装定義の方法で

(2011標準、最新ドラフトセクション5.1.2.2.1、強調が追加されました。)

mainC標準ではへの再帰呼び出しは禁止されていません。これは、それを非合法化するC++との違いです。

于 2012-07-18T18:20:32.987 に答える
2

これは、C99以降でのみ有効であり、実装が5つのパラメーター(4と1 )を取り、返す可能性のある文書を明示的に作成します(これは、larsmansが削除されていない回答で参照した「または他の実装定義の方法」句です。そして私はその条項がC89に存在したとは思わない)。 mainintchar *void

それ以外の場合、動作は未定義です。つまり、コンパイラが動作をチョークする場合としない場合があります。

于 2012-07-18T18:24:10.470 に答える
2

あなたはそれが実行されないことを意味しますか? 引数mainを取るように定義されています。int, char**

コンパイラーによっては、ランタイムが見つからないために起動に失敗するmain(int, char**)か、古いコンパイラーではスタックをいじくり回すためにクラッシュするだけです。

于 2012-07-18T18:20:00.703 に答える