3

私はC++の初心者です。1 つの関数を 2 回宣言しても問題ない理由 (つまり、コンパイラがそれを許可する理由) がわかりません。たとえば、次のコードは有効です。

#include <iostream>
#include <string>

int hello();
int hello();

int main(){
    cout << "hello, world" << endl;
}

int hello(){
    return 1;
}

コンパイラが文句を言わないのはなぜですか?

4

2 に答える 2

1

C および C++ では、前方宣言は非常に弱いものです。これらは、指定された署名を持つ関数が表示された場合、指定した署名を持つという正式な「約束」をコンパイラに提供します。関数が表示されることさえ保証されていません。宣言された関数を呼び出したり参照したりしない限り、コンパイラは、定義のない宣言があると文句を言うことはありません。標準では、コンパイラが同一の前方宣言を単一の宣言として扱うことを要求しています。

単一定義規則に従って一意でなければならない定義とは異なり

3.2 翻訳単位には、変数、関数、クラス型、列挙型、またはテンプレートの複数の定義が含まれてはならない

宣言は単に同じ定義を参照する必要があるだけです。つまり、互いに同等である必要があります。

3.3.4 同じ非修飾名を指定する同じ宣言領域内の一連の宣言が与えられた場合、それらはすべて同じエンティティを参照するか、すべてが関数または関数テンプレートを参照する [...]

于 2013-05-20T03:31:10.200 に答える
0

あなたの疑問は「ワン・デフィニション・ルール」でクリアされます。これは、ISO C++ 標準 (ISO/IEC 14882) 2003 のセクション 3.2 で定義されています。

それは次のように述べています:

どの翻訳単位でも、テンプレート、型、関数、またはオブジェクトは、複数の定義を持つことはできません。これらのいくつかは、任意の数の宣言を持つことができます。

詳細については、ウィキペディア ( http://en.wikipedia.org/wiki/One_Definition_Rule )を参照してください。

于 2013-05-20T03:28:02.883 に答える