このコードは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");
}
}
そうでない場合、なぜですか?
エラーが1つあります。&"Hello Stackoverflow"
タイプがないchar*
ため、そのタイプを期待する関数にそれを渡さないでください。
それとは別に、このプログラムは実装固有の拡張として標準で許可されていますが、コンパイラはそれを拒否する自由があります。
プログラムの起動時に呼び出される関数の名前は
main
です。実装は、この関数のプロトタイプを宣言していません。int
これは、パラメータなしのリターンタイプで定義する必要があります。
int main(void) { /* ... */ }
または2つのパラメーターを使用します(ここでは、
argc
およびと呼ばれますargv
が、宣言されている関数に対してローカルであるため、任意の名前を使用できます)。
int main(int argc, char *argv[]) { /* ... */ }
または同等のもの; または他の実装定義の方法で。
(2011標準、最新ドラフトセクション5.1.2.2.1、強調が追加されました。)
main
C標準ではへの再帰呼び出しは禁止されていません。これは、それを非合法化するC++との違いです。
これは、C99以降でのみ有効であり、実装が5つのパラメーター(4と1 )を取り、返す可能性のある文書を明示的に作成します(これは、larsmansが削除されていない回答で参照した「または他の実装定義の方法」句です。そして私はその条項がC89に存在したとは思わない)。 main
int
char *
void
それ以外の場合、動作は未定義です。つまり、コンパイラが動作をチョークする場合としない場合があります。
あなたはそれが実行されないことを意味しますか? 引数main
を取るように定義されています。int, char**
コンパイラーによっては、ランタイムが見つからないために起動に失敗するmain(int, char**)
か、古いコンパイラーではスタックをいじくり回すためにクラッシュするだけです。