63

次の意味は何ですか:

int main(void) {...} 

VS

int main() {...}

?

int main() {...}これは、 main が(コマンドラインから)パラメーターをまったく受け取らないことを意味すると思いますが、次のとおりです。

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

します。

しかし、どういうint main(void) {...} 意味ですか?そして、ボイドは何の略ですか?

私はここを見てきましたが、それはどういうわけか別の質問です.

4

9 に答える 9

54

C ++では、違いはありません。


Cでは、違いは疑わしいです。void後者のバージョン(のないバージョン)は技術的には単なる一般的な実装拡張であり、標準の文言のために標準で動作することが保証されていないことを主張するのが好きな人もいます。ただし、この標準では、関数定義では、空のパラメーターセットには明確に定義された動作があり、関数はパラメーターを受け取らないと明確に規定されています。したがって、mainのこのような定義は、標準の次の説明と一致します。

[main]は、戻り型intを使用し、パラメーターを使用せずに定義する必要があります。

ただし、この2つには顕著な違いがあります。つまり、バージョンvoidは関数の正しいプロトタイプを提供することに失敗しません。

// this is OK.
int main()
{
  if (0) main(42);
}

// this requires a diagnostic to be shown during compiling
int main(void)
{
  if (0) main(42);
}

ああ、そして完全に言えばvoid、すべての関数宣言子で次の意味があります。

(6.7.6.3p10)リスト内の唯一の項目としてのvoid型の名前のないパラメーターの特殊なケースは、関数にパラメーターがないことを指定します。

于 2012-09-01T05:38:05.497 に答える
6

まず、ここに示すように、ホストされたシステムと独立したシステムで許可されるものには違いがあります。

ホストされたシステムの場合、5.1.2.2.1 プログラムの起動が適用されます。

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

int main(void)

... (argv/argc などのスタイルに関するテキストが続きます)。

興味深いのは「パラメータなし」です。int main()int main (void)は、どちらも関数宣言子であり、パラメーターを持たないため、現在は同等です。以下が適用されます (6.7.6.3 ):

10 リスト内の唯一の項目としてのタイプ void の名前のないパラメーターの特殊なケースは、関数にパラメーターがないことを指定します。

/--/

14 識別子リストは、関数のパラメータの識別子のみを宣言します。その関数の定義の一部である関数宣言子の空のリストは、関数にパラメーターがないことを指定します。その関数の定義の一部ではない関数宣言子の空のリストは、パラメーターの数または型に関する情報が提供されないことを指定します.145)

私を強調してください。太字のテキストは に適用されるものint main()です。145) テキストの末尾にも注記があり、「「将来の言語の指示」(6.11.6) を参照してください」と書かれています。

6.11.6 関数宣言子

括弧が空の関数宣言子 (プロトタイプ形式のパラメーター型宣言子ではない) の使用は廃止予定の機能です。

そして、ここに違いがあります。関数宣言子でint main()あることは、C 標準の次のバージョンで動作することが保証されていないため、上記の理由から不適切なスタイルです。これは、C11 で廃止予定の機能としてフラグが立てられています。

したがってint main (void)、ホストされたシステムでは常に使用し、int main()今のところ 2 つの形式が同等であっても決して使用しないでください。


C++ では、どちらの形式も完全に同等ですがint main()、主観的で表面的な理由から好ましいスタイルがあります (Bjarne Stroustrup はそう言っています... これは、特定の方法で何かを行う理由を説明するためのおそらく非常に悪い理論的根拠です)。

于 2015-07-10T08:48:36.503 に答える
5

Cでは、プロトタイプ(C ++ではありません)では、空の引数リストは、関数が任意の引数を取ることができることを意味します(関数の定義では、引数がないことを意味します)。C ++では、空のパラメータリストは引数がないことを意味します。Cでは、引数を取得しないために、を使用する必要がありますvoidより良い説明については、この質問を参照してください。

于 2012-09-01T05:37:56.643 に答える
4

C ++では関数がfoo(void)ありfoo()、同じことです。ただし、Cでは異なります。foo(void)は引数のない関数ですが、は引数が指定されていない関数foo()です。

于 2012-09-01T05:38:14.097 に答える
3

C++ では違いはなく、どちらも同じです。

両方の定義は C でも機能しますが、void を使用した 2 番目の定義の方が技術的に優れていると考えられます。これは、main をパラメーターなしでのみ呼び出すことができることを明確に指定しているためです。C では、関数シグネチャで引数が指定されていない場合、その関数は任意の数のパラメーターを使用して、またはパラメーターなしで呼び出すことができることを意味します。たとえば、次の 2 つの C プログラムをコンパイルして実行してみてください (ファイルを .c として保存することを忘れないでください)。

于 2015-05-23T03:05:05.437 に答える
1

C ++では、この2つに違いはなくint main()、の有効な署名および戻り型ですmain

于 2012-09-01T05:31:50.097 に答える