2016-12-29 22 views
5

C++では、変数を複数回宣言するとコンパイル時にエラーが表示されます。たとえば:C++で複数回関数と変数を宣言する

int x; 
int x; 

機能を複数回宣言している間は、コンパイル時にエラーが表示されません。例:

int add(int, int); 
int add(int, int); 

なぜC++ではこの区別がありますか?

+0

関数をオーバーロードすることはできますが、パラメータの数と種類は異なる必要があります。変数に過負荷をかけることはできません。 – nischalinn

+0

それはちょうど再宣言をオーバーロードしていません。宣言はいつでも行うことができます。 – user1438832

+0

は、関数の宣言ではなく、プロトタイプの宣言であり、複数回実行できます。これは実際にCと区別されています。プロトタイプは本体なしの宣言であり、宣言AND本体は定義を考慮して定義されているため、一度だけ発生する可能性があります。 – Swift

答えて

12

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は違反していません。

+1

'int add(int int) '宣言は定義ではないので、ODRは適用されません。 – Peter

+0

説明をありがとう!それは私の疑問に答える。 :) –

+0

ヘッダー内の関数の前方宣言は、依存関係管理(本質的に "リンク時にこの署名を持つ関数があると仮定することができます"と言っている)にとって非常に重要であることに注意する価値があります。この前方宣言は、同じ宣言を含む異なるヘッダが含まれていると、重複につながりやすくなります。しかし、変数の重複定義は、同じ名前を持つ2つの異なるインスタンスを意味し、それらを明確にする方法はありません。 (したがって、許可されていません。) –