C++では、変数を複数回宣言するとコンパイル時にエラーが表示されます。たとえば:C++で複数回関数と変数を宣言する
int x;
int x;
機能を複数回宣言している間は、コンパイル時にエラーが表示されません。例:
int add(int, int);
int add(int, int);
なぜC++ではこの区別がありますか?
C++では、変数を複数回宣言するとコンパイル時にエラーが表示されます。たとえば:C++で複数回関数と変数を宣言する
int x;
int x;
機能を複数回宣言している間は、コンパイル時にエラーが表示されません。例:
int add(int, int);
int add(int, int);
なぜC++ではこの区別がありますか?
int x;
は(ちょうど)declarationではなく、definitionです。 ODRに違反したため、1つの翻訳単位で1つの定義のみが許可されます。
変数の宣言は以下のように書くことができる:一方int add(int, int);
で
// a declaration with an extern storage class specifier and without an initializer
extern int x;
extern int x;
宣言(関数の)正確です。 1つの翻訳単位での複数の宣言は正常ですが、ODRは違反していません。
'int add(int int) '宣言は定義ではないので、ODRは適用されません。 – Peter
説明をありがとう!それは私の疑問に答える。 :) –
ヘッダー内の関数の前方宣言は、依存関係管理(本質的に "リンク時にこの署名を持つ関数があると仮定することができます"と言っている)にとって非常に重要であることに注意する価値があります。この前方宣言は、同じ宣言を含む異なるヘッダが含まれていると、重複につながりやすくなります。しかし、変数の重複定義は、同じ名前を持つ2つの異なるインスタンスを意味し、それらを明確にする方法はありません。 (したがって、許可されていません。) –
関数をオーバーロードすることはできますが、パラメータの数と種類は異なる必要があります。変数に過負荷をかけることはできません。 – nischalinn
それはちょうど再宣言をオーバーロードしていません。宣言はいつでも行うことができます。 – user1438832
は、関数の宣言ではなく、プロトタイプの宣言であり、複数回実行できます。これは実際にCと区別されています。プロトタイプは本体なしの宣言であり、宣言AND本体は定義を考慮して定義されているため、一度だけ発生する可能性があります。 – Swift