2016-04-18 1 views
0

this simple issueを解決した後、私は質問しなければなりませんでした:constとしての宣言が別の場所で実行される場合、定義時にconst指定子を繰り返さなければならないのはなぜですか?

- >クラスのHファイルでは、const staticメンバーが定義されています。 :

class ex { 
    const static int my_ex; 
}; 

- > CPPで値をファイルは

ex::my_ex = 32; 

を指定され、その後1は、エラー「競合の宣言」(同様に「タイプに名前を付けていません」)を取得します。私は、CPPファイル内定義もしかし、リンカから見た競合を作成し宣言であることを理解し、なぜのみ静的のconst指定子(およびタイプ)とではないでしょうか?私は書くだけで

const int ex::my_ex = 32; 

コンパイルすることができます。しかし静的ではない...どうして?なぜ私はちょうどを定義することができませんを定義し、宣言関連手順(タイプ、特定の識別子)を繰り返しませんか?

+1

'static'は決して定義に使用されません。 –

+0

Ok ...しかし** **は本当に私の質問です... –

+0

静的な宣言と静的な定義は異なることを意味します。 – SergeyA

答えて

6

これは歴史的なものです。

Cでは、定義上のstaticは「内部リンケージ」を意味します。 C++が登場し、クラスが追加されたとき、Bjarneは静的メンバーを示すためのキーワードが必要でした。新しいキーワードを追加したくない(この日にはまだほとんど存在する嗜好)、代わりにstaticを再利用しました。

ここでstaticは、どこに置かれたかによって2つの異なるものを意味しました。だからあなたはstaticを書くことができないので、ここに何か他の意味があるので。したがって、言語は、あなたが愚かであるように、それを必要としません。

その理由を越えて、はそれだけでです。言語を作成するときは、仕様の簡素化と実装の簡素化との使い分けをバランスさせ、言語である一連のルールを思いつきます。いくつかの点で、あなたはなぜ、何か重要でないルールが作成され、ちょうどあなたのプログラムを書くことに乗り遅れるのを止めなければなりません。

関連する問題