これは私のプログラムです:
main()
{
printf("hello world\n");
}
コンパイル時に次の警告が表示されます。
function should return a value
に変更main()
するvoid main()
と警告が消えます。
どうしてこんなことに?
注意すべき点がいくつかあります。
int
関数のmain()
戻り値の型です。つまり、main()
返される値の種類は整数です。main( )
C90 コンパイラでは許容されていましたが、C99 コンパイラでは許容されていませんでした。これは、C99 標準の一部ではないことを意味するため、これを行わないでください。void main()
は標準形式ではありません。一部のコンパイラはこれを許可していますが、どの標準もこれをオプションとしてリストしていません。したがって、コンパイラはこの形式を受け入れる必要はなく、受け入れないコンパイラもいくつかあります。繰り返しますが、標準形式に固執すれば、プログラムをあるコンパイラから別のコンパイラに移動しても問題は発生しません。最後にもう 1 つ、次のように main を書く代わりに:
int main()
//ここでは、 main に引数を渡すことについて黙っています。つまり、引数を取る場合と取らない場合があります。
次のように書きます。
int main(void)// this specifies there are no arguments taken by main
詳細については、 C99 標準 を参照してください。
の戻り値の型を指定しなかったため、警告が表示されましたmain
。
通常は成功のために、常に を使用int main
し、数値を返す必要があります。int
0
int main()
{
printf("hello world\n");
return 0; //you can omit this since C99
}
ホストされた環境で使用void main
すると (通常、そうでない場合、以下が当てはまる必要はありません)、未定義の動作が発生します。一部のコンパイラでは機能しますが、決して使用しないでください。
標準ではmain
、2 種類のプロトタイプがあり、どちらも次の値を返しますint
。
C11 5.1.2.2.1プログラム起動
プログラムの起動時に呼び出される関数は main と呼ばれます。実装は、この関数のプロトタイプを宣言していません。これは、戻り値の型が int で、パラメーターなしで定義されます。
int main(void) { /* ... */ }
または 2 つのパラメーター (ここでは argc および argv と呼ばれますが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):
int main(int argc, char *argv[]) { /* ... */ }
または同等のもの; 10) または他の実装定義の方法で。
int
c は、データ型が宣言されていない関数に対して、データ型を自動的に暗黙指定します。したがって、コンパイラに関する限り、上記は次のとおりです。
int main()
{
printf("hello world\n");
}
return
これは、文の最後に整数を返すことを想定しています。void main()
関数に戻り値がないことをコンパイラに伝えているときに明示的に指定した場合、警告はありません。
これがエラーではない理由は、指定されていない場合main()
はreturn 0;
実行の最後にあるためです。ただし、コンパイラは、これが発生しているという警告を引き続き表示します。
ベストプラクティスは、このようにプログラム実行の最後にint main()
使用することです。return 0
int main()
{
printf("hello world\n");
return 0;
}
詳細については、この質問を参照してください。