2016-09-05 4 views
3

Итак, у меня есть файл заголовка, полный глобальных переменных. здесь не пример, как реализация выглядит (в файле .cpp):Условный оператор - единственный способ инициализировать глобальные переменные в глобальной области?

extern double event::m_chance = 0.01; 

Ничего особенного до сих пор. Но когда мой код стал более сложным, я начал реализовывать #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 
} 

Я просто спрашиваю себя, действительно ли это то, что делают все остальные в моем положении. Или есть nicer (стандарт -defined) способ инициализировать их .. (например, сделать дополнительную функцию и т. Д.).

Спасибо за вашу помощь/советы!

+0

Я хотел бы сделать то же самое, что вы делаете в вашем первом примере. Но если вы хотите изменить переменную или изменить структуру своего кода, вы всегда можете назначить значение по умолчанию '0.01', а do' if (MASTER_MODE) {event :: m_chance = 0.5;} '. Но это изменяет переменную во время выполнения не в препроцессоре – meetaig

+3

Нет, это не единственный способ. Существуют опции, включающие специализацию шаблонов (все версии C++) или (C++ 11 и более поздние) 'constexpr', lambdas и т. Д. И т. Д. – Peter

+0

Соответствует: http://stackoverflow.com/questions/16354575/whys-initializing- a-global-variable-with-return-value-of-a-function-failing-at – 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

это будет аккуратно работать для одной переменной, но у меня есть преграды из них ! –

+0

Зачем вам использовать это более подробное решение lol –

Смежные вопросы