次の 2 つの関数定義を検討してください。
void foo() { }
void foo(void) { }
これら2つに違いはありますか?そうでない場合、なぜvoid
そこに議論があるのですか?審美的な理由?
Cで:
void foo()
foo
「指定されていない型の指定されていない数の引数を取る 関数」を意味しますvoid foo(void)
foo
「引数を取らない関数」を意味しますC++ の場合:
void foo()
foo
「引数を取らない 関数」を意味しますvoid foo(void)
foo
「引数を取らない関数」を意味しますしたがって、 を記述することによりfoo(void)
、両方の言語で同じ解釈を実現し、ヘッダーを多言語化します (ただし、通常、ヘッダーを真に言語間で使用できるようにするには、ヘッダーにさらに何かを行う必要があります。つまり、extern "C"
コンパイルする場合は、ヘッダーを にラップしますC++)。
あなたの質問は 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 が空の場合、関数は引数を取りません。パラメーター リスト (void) は、空のパラメーター リストと同等です。
C99
C++11 で言及されているようにint f()
、引数について何も指定しておらず、廃止されています。
作業コードまたは UB につながる可能性があります。
https://stackoverflow.com/a/36292431/895245で C99 標準を詳細に解釈しました。
C では、空の関数参照で void を使用して、コンパイラがプロトタイプを持ち、そのプロトタイプに「引数がない」ようにします。C++ では、プロトタイプを除外できないため、プロトタイプがあることをコンパイラに伝える必要はありません。