2016-09-05 4 views
3

私はグローバル変数でいっぱいのヘッダーファイルを持っています。条件演算子グローバル変数をグローバルスコープで初期化する唯一の方法は?

extern double event::m_chance = 0.01; 

これまで何も特別:ここ は(.cppファイル内)のような実装がどのように見えるかの例です。しかし、私のコードが複雑になると、私はテスト目的のために#define MASTER_MODEを実装し始めました。 は、だから今、それは次のようになります。

extern double event::m_chance = MASTER_MODE ? 0.5 : 0.01; 

と私は自分自身に尋ねた:これは(条件付き)グローバルスコープでグローバル変数を初期化する唯一の方法ですか? if文がここでは機能しないので...それは正しくなければなりません。

//declarations 
extern double event::m_chance; 

if (MASTER_MODE) { //Error: excepted a declaration 
    event::m_chance = 0.5; 
    //other variables should be here 
} 
else { //nope 
    event::m_chance = 0.01; 
    //other variables should be here 
} 

これは他の人が私の立場でやっていることだと私は尋ねます。または、が好きなようになります(追加機能の作成など)。標準-defined)です。

ご協力いただきありがとうございます。

+0

私はあなたの最初の例では、あなたがそうであるように同じことをするだろう。しかし、変数を変更したり、コードの構造を変更したりする場合は、デフォルト値 '0.01'とdo(MASTER_MODE){event :: m_chance = 0.5;}をいつでも割り当てることができます。しかしこれは、プリプロセッサではなく実行時に変数を変更します – meetaig

+3

いいえ、それは唯一の方法ではありません。テンプレート特殊化(C++の全バージョン)または(C++ 11以降) 'constexpr'関数、ラムダなどのオプションがあります。 – Peter

+0

関連:http://stackoverflow.com/questions/16354575/whys-initializing-関数の戻り値がグローバル変数である場合 – Lanting

答えて

3
#ifdef MASTER_MODE 

    extern double event::m_chance = 0.5; 
    //other variables should be here 

#else 

    extern double event::m_chance = 0.01; 
    //other variables should be here 

#endif 
+0

うわーはそれについても考えていませんでした。総合感覚とそれはパフォーマンスに優しい!ありがとうございました:) –

+1

@StackDanny IMHO、パフォーマンスは三項演算子であなたのコードと同じです:現代のコンパイラは常に条件を最適化し、コンパイル時に条件がわかっているためコンパイラは条件の結果を直接入れることができます。また、変数がMASTER_MODEに存在するかどうかを直接確認できるので、私はあなたの三項演算子を好むでしょう – Garf365

+0

真の真です。あなたは正しいよ –

0

ラムダはいかがですか?

#include <iostream> 

bool some_condition = true; 

int some_global = [&]() 
{ 
    if (some_condition) 
    { 
     return 10; 
    } 
    else 
    { 
     return 20; 
    } 
}(); 

int main() { 
    std::cout << some_global; 
} 
+0

...またはグローバルリンクを持つ関数/オブジェクトの結果 –

+0

これは1つの変数に対してきれいに機能しますが、 ! –

+0

なぜこの大規模な解決策をもっと冗長に使うのでしょうか –

関連する問題