この点でCとC ++は異なります。
C 2011オンライン標準
6.7.6.3関数宣言子(プロトタイプを含む)
...
10 void
リスト内の唯一の項目としての型の名前のないパラメーターの特殊なケースは、関数にパラメーターがないことを指定します。
...
14識別子リストは、関数のパラメーターの識別子のみを宣言します。その関数の定義の一部である関数宣言子の空のリストは、その関数にパラメーターがないことを指定します。その関数の定義の一部ではない関数宣言子の空のリストは、パラメーターの数またはタイプに関する情報が提供されないことを指定します。145)
つまり、関数宣言の空のパラメーターリストは、関数が指定されていない数のパラメーターを受け取ることを示し、関数定義の空のパラメーターリストは、関数がパラメーターを受け取らないことを示します。
T foo( void ); // declaration, foo takes no parameters
T bar(); // declaration, bar takes an *unspecified* number of parameters
T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... } // definition, bar takes no parameters
Cに関する限り、関数の宣言または定義で空の識別子リストを使用しないでください。関数がパラメーターを取得することを意図していない場合void
は、パラメーターリストで使用して指定します。
オンラインC ++標準
8.3.5関数[dcl.fct]
...
4 parameter-declaration-clauseは、関数が呼び出されたときに指定できる引数とその処理を決定します。[ 注:パラメータ宣言句は、関数呼び出しで指定された引数を変換するために使用されます。5.2.2を参照してください。— end note ] parameter-declaration-clauseが空の場合、関数は引数を取りません。非依存型の名前のない単一のパラメーターで構成されるパラメーターリストvoid
は、空のパラメーターリストと同等です。この特別な場合を除いて、パラメーターはtypeを持ちませんcv void
。もしパラメータ宣言節省略記号または関数パラメータパック(14.5.3)で終了する場合、引数の数は、デフォルト引数を持たず、関数パラメータパックではないパラメータの数以上でなければなりません。構文的に正しい場合、および「...」が抽象宣言子の一部ではない場合、「、...」は「...」と同義です。[ 例:宣言 int printf(const char*, ...);
さまざまな数とタイプの引数で呼び出すことができる関数を宣言します。 printf("hello world");
printf("a=%d b=%d", a, b);
ただし、最初の引数は、次のように変換できる型でなければなりませんconst char*
— end example ] [ 注:標準ヘッダーに<cstdarg>
は、省略記号(5.2.2および18.10を参照)を使用して渡される引数にアクセスするためのメカニズムが含まれます。— 終了ノート ]
C ++の場合、宣言または定義のいずれかの空のパラメーターリストは、関数が引数を取らないことを示し、のパラメーターリストを使用するのと同等ですvoid
。