2013-04-05 27 views
11

共有ヘッダー。グローバルconst charには "静的"が必要ですが、ブールには必要ないのはなぜですか?

私はこれを行うことができます。複数のファイルの中に含ま際

const bool kActivatePlayground=false;

が正常に動作します。

私はこれを行うことはできません。エラーで

const char * kActivePlayground = "kiddiePool";

結果:重複したシンボルを。

しかし、これは動作します:

static const char * kActivePlayground = "kiddiePool";

staticconst char *のためではなく、const boolのために必要とされるのはなぜ?また、constは常にstatic暗黙のため、staticは不要だと思いましたか?

+0

staticはシンボルをそのTU専用にします。エラーから、他のファイルにconst char *の再定義がないことを確認しましたか? –

+0

これは再び変数名 – johnbakers

+0

の唯一の定義です。私は繰り返します: 'const'は暗黙的に' static'ですので、 'static'という単語を使用する必要はありません。 'bool'のために必要です – johnbakers

答えて

26

C++では、デフォルトで変数は静的リンケージを持ち、非const変数は外部リンケージを持ちます。

複数の定義エラーの理由は

const char * kActivePlayground = "kiddiePool"; 

は外部結合を持つ変数を作成することです。

ちょっと待ってませんでしたが、私はちょうどconstという変数が静的なリンケージにデフォルト設定されていると言いますか?はい、私はしました。しかしkActivePlaygroundconstではありません。 const charへのポインタではないconstです。

これは、あなたが期待通りに動作します:

const char * const kActivePlayground = "kiddiePool"; 
+0

本当にありがとうございます。私はこれを逃したとは信じられません。 – johnbakers

+0

ありがとう、ベン。私もそれを逃して、それが内部リンケージとしての資格をいかなかったのか見ようと私の頭を悩ましていました。いい答え。 – WhozCraig

+2

これは、私が(const)は、あなたが疑問に思うかもしれないが、 'char const *'は疑問に思うかもしれないということを(英語のスピーカーに対して)議論する理由です。 –

0

あなたが一定のchar配列を使用することができます

const char kActivePlayground[] = "kiddiePool"; 

とそれが参照

const char* playground_text = kActivePlayground; 
あるのでkActivePlaygroundも割り当てに使用することができます
関連する問題