2013-11-08 2 views
-2

Мне было интересно, можно ли определить определение, которое изменяет значения в какой-то момент кода в условном выражении. В основном что-то вроде этого:Условие препроцессора

//////////////////////////////////////////// SomeFile.cpp 
#define SHUTDOWN false 

while(window->isOpen()) 
{ 
    if(SHUTDOWN) 
     window->close(); 
    // Rest of the main loop 
} 

//////////////////////////////////////////// SomeOtherFile.cpp 

if(Escape.isPressed()) 
{ 
    #undef SHUTDOWN 
    #define SHUTDOWN true 
} 

Таким образом, приложение закрывается. Если это не так, что имея такую ​​функцию

RenderWindow* getWindow() 
{ 
    return window; 
} 

и затем вызвать

if(Escape.isPressed()) 
    getWindow()->close(); 

Лучший способ сделать это? Я бы предпочел не идти по этому маршруту, потому что классы, вызывающие ключевое событие, являются членами класса, управляющего основным циклом и окном, поэтому мне нужно будет установить указатели на содержащий класс в меньших классах, чтобы вызвать getWindow (), и это просто похоже на более сложный метод. Но если я не могу это сделать с помощью директив препроцессора, я просто должен использовать указатели для родительского класса.

+6

Почему использование 'define' в конце концов (вместо обычной переменной)? Это директива препроцессора, она выполняется только один раз во время компиляции и НЕ во время выполнения. –

+1

Вы полностью неправильно поняли инструкции препроцессора. Они оцениваются во время компиляции. –

+0

Где бы нормальная переменная была так, чтобы я мог получить к ней доступ из сферы действия этих классов? Классы, вызывающие событие, на самом деле даже не знают о существовании родителей. Фактически, когда они создаются, они входят в вектор внутри класса, который является членом общего класса. – Mike

ответ

0

Вы неправильно понимаете использование символов препроцессора. Подумайте о коде препроцессора как отдельном коде, который запутан с вашим кодом c/C++. Во время компиляции выполняется код препроцессора, и это выполнение приводит к исходному коду, который компилятор затем скрывает в двоичном формате. Вы не можете использовать символы препроцессора во время выполнения, потому что они не существуют (они были скомпилированы). Похоже, вы, возможно, захотите использовать переменную с глобальным охватом в том, что вы делаете.

0

Предварительно обработанный условный режим является условием только в течение первой, предварительной обработки, фазы компиляции.

После того, как эта фаза компиляции была завершена, макрос (значение #define) эффективно заменяется установками.

Когда вы пишете

if (SHUTDOWN) 

то, что компилятор видит значение «SHUTDOWN» в то время, что предварительная обработка закончена и компиляция собственно начать. Так

#define SHUTDOWN true 
if (SHUTDOWN) 

компилирует

if (true) 

тогда

#define SHUTDOWN 

if (SHUTDOWN) 

failes скомпилировать, а

if() 

Если вы были #define ВЫКЛЮЧЕНИЕ разрешить переменной, то да, это абсолютно по поскольку переменные могут меняться во время выполнения. Но константы этого не делают.

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