回答:
ではC:
void foo()
「foo
不特定のタイプの不特定の数の引数を取る 関数」を意味しますvoid foo(void)
「foo
引数を取らない関数」を意味しますではC ++:
void foo()
「foo
引数を取らない関数」を意味します void foo(void)
「foo
引数を取らない関数」を意味しますfoo(void)
したがって、を記述することで、両方の言語で同じ解釈を実現し、ヘッダーを多言語にします(通常、ヘッダーをさらにクロスランゲージにするために、ヘッダーにさらにいくつかの処理を行う必要があります。つまり、extern "C"
コンパイルしている場合は、 C ++)。
void
、「最も厄介な解析」の問題を回避できたはずです。
void foo()
を宣言する唯一の構文でした。署名が導入されたとき、C委員会はパラメータなしを古い構文から明確にする必要があり、void foo(void)
構文を導入しました。C ++は互換性のためにそれを採用しました。
void foo()
代わりにvoid foo(void)
を使用すると機能に違いが生じるC C90以降の例を教えてください。つまり、私は何年もボイドのないバージョンを使用しており、何の問題も見ていません。
void foo() { if ( rand() ) foo(5); }
コンパイルして実行します(非常に幸運でない限り、未定義の動作を引き起こします)。一方void foo(void)
、同じ本体を使用すると、コンパイルエラーが発生します。
あなたの質問はC ++に関するものだと思いますが、Cに関してはK&Rの72〜73ページに答えがあります。
さらに、関数宣言に引数が含まれていない場合、次のようになります。
double atof();
これも、atofの引数について何も想定されていないことを意味すると解釈されます。すべてのパラメーター検査がオフになります。空の引数リストのこの特別な意味は、古いCプログラムが新しいコンパイラでコンパイルできるようにすることを目的としています。しかし、新しいプログラムで使用するのは悪い考えです。関数が引数を取る場合は、それらを宣言します。引数を取らない場合は、voidを使用します。
C ++ 11 N3337標準ドラフト
違いはありません。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
付録C「互換性」C.1.7条項8:宣言者は次のように述べています。
8.3.5変更:C ++では、空のパラメーターリストで宣言された関数は引数を取りません。Cでは、空のパラメーターリストは、関数の引数の数と型が不明であることを意味します。
例:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
理論的根拠:これは、誤った関数呼び出し(つまり、引数の数またはタイプが間違っている関数呼び出し)を回避するためです。
元の機能への影響:明確に定義された機能のセマンティクスへの変更。この機能は、Cでは「廃止」としてマークされていました。
8.5.3関数は言う:
4. parameter-declaration-clauseは、関数が呼び出されたときに、指定できる引数とその処理を決定します。[...] parameter-declaration-clauseが空の場合、関数は引数を取りません。パラメーターリスト(ボイド)は、空のパラメーターリストと同等です。
C99
C ++ 11で言及されているようにint f()
、引数については何も指定せず、廃止予定です。
コードまたはUBが機能する可能性があります。
私はC99標準を詳細に解釈しました:https : //stackoverflow.com/a/36292431/895245