web-dev-qa-db-ja.com

void mainとint mainの違いは?

C++プログラムをどのように宣言するかは重要ですか?

53
Kredns

違いは、1つはmainを定義する正しい方法ですが、もう1つはそうではありません。

はい、それは重要です。どちらか

_int main(int argc, char** argv)
_

または

_int main()
_

c ++仕様によるmainの適切な定義です。

void main(int argc, char** argv)

iIRCは、以前のMicrosoftのC++コンパイラに付随する問題でした。

https://isocpp.org/wiki/faq/newbie#main-returns-int

69
Alan

Bjarne Stroustrup これを非常に明確にしました:

定義void main()はC++ではなく、C++でもありません。

参照 を参照してください。

25
vobject

int mainを使用する必要があります。 C標準とC++標準の両方は、mainが値を返すことを指定しています。

12
RedBlueThing

C++の場合、intのみが許可されます。 Cの場合、C99はintのみが許可されていると言います。以前の標準では、voidを返すことができました。

つまり、常にintです。

9
Joe

重要なのは、Cプログラム(およびC++も同じ)は常に成功値またはエラーコードを返す必要があるため、そのように宣言する必要があるということです。

4
Svante

C++では、main()intを返す必要があります。ただし、C99ではmain()int以外の戻り値型を持つことができます。 C99標準からの抜粋です。

5.1.2.2.1プログラムの起動

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

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

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

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

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

また、gccはvoid main()をコンパイルしますが、実際にはreturn 0;閉じ括弧に遭遇したとき。

3
Masked Man

かなり前に、私は このページ(void main(void)) を見つけました。これには、「標準では無効であると言う」引数以外の多くの理由が含まれていました。特定のオペレーティングシステム/アーキテクチャでは、スタックが破損したり、その他の厄介なことが発生したりする可能性があります。

3
X-Istence

仕様を順守している場合は、mainを返すintを常に宣言する必要があります。

ただし、実際には、ほとんどのコンパイラーはどちらか一方を使用できるため、実際の違いは、シェルに値を返す必要があるかどうかです。

2
Electrons_Ahoy