2

У меня есть следующий код#define, #ifdef #undef #endif

#define PROC_ADD 

void main(void) 
{ 
    while(1) 
    { 
#ifdef PROC_ADD 
// Do this code here then undefined it to run the code in the else 
// processing work 
#undef PROC_ADD 
#else 
// now that PROC_ADD has been undefined run this code 
// processing work 
#endif 
    } 
} 

Однако, он будет работать код. Но он не будет запускать код в else после того, как PROC_ADD не определен.

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

+0

Обратите внимание, что предварительная обработка не выполняется во время выполнения, 'undef' не выполняется во время выполнения. Это происходит во время компиляции. – abyx

ответ

4

Что вы делаете, это сборка время эквивалент:

int x = 1; 

int main() 
{ 
    if (x) 
    { 
     ... 
     x = 0; 
    } 
    else 
    { 
     ... 
    } 
} 

IfDef и т.д. произойти во время сборки, но для примера, что это не проблема. После того, как вы оцениваете if (либо время выполнения, либо время сборки), решение о том, какая ветка должна быть выполнена. Изменение чего-либо после принятия решения не меняет этого решения.

+0

Не #ifdef предварительно обработан перед компиляцией? –

+0

@ Суреш - да, предварительная обработка выполняется до компиляции. Но поскольку компиляторы автоматически вызывают pr-процессор, я не думаю, что различие важно для таких вопросов. Тем не менее, я изменю свой ответ, чтобы более точным использовать «время сборки» вместо «время компиляции». –

3

#define s работает только при предварительной обработке. Так

#define PROC_ADD 
void main(void) 
{ 
#ifdef PROC_ADD 
// Do this code here then undefined it to run the code in the else 
// processing work 
#undef PROC_ADD 
#else 
// now that PROC_ADD has been undefined run this code 
// processing work 
#endif 
} 

будет обработан следующим образом: поскольку PROC_ADDR определяется препроцессор полностью исключить #else ветви, а затем выполнить #undef, так что код #else ветви никогда не выживает предобработку и не достигает компилятор.

3

Условие ifdef оценивается при достижении препроцессора. Когда вы undefPROC_ADD внутри кода ifdef ', препроцессор уже определил, какой раздел кода включить и который игнорировать.

Кроме того, да: ifdef, undef и т. Д. Обрабатываются в процессе предварительной обработки - компилятор даже не видит эти так называемые директивы. Это, конечно, означает, что код времени выполнения никогда не видит этих директив.

Редактировать: Препроцессор работает, проводя один проход через текстовый файл. Препроцессор даже не волнует, что ваш текстовый файл содержит код C! Он имеет нулевое знание о том, что ваши ifdef и else s и что еще не внутри петли while.

2

Итак, вы хотите, чтобы код, представленный во второй части комментария, был всегда бежать? Почему бы просто не сделать

#ifdef PROC_ADD 
// Do the stuff to be done if PROC_ADD is defined 
#undef PROC_ADD 
#endif 
// Do the stuff to always be done 

Редактировать

OK - если вы хотите, время выполнения изменения в поведении следует использовать во время выполнения конструкции (например, в качестве переменной, чтобы служить в качестве флага). Как мы все говорим;), директивы предварительного процессора оцениваются один раз только во время компиляции.

+0

Я отредактировал мое сообщение. Это был лишь краткий пример. Однако сам код будет работать в цикле. Однако в первом цикле я хотел бы запустить первый оператор if. Затем на второй и последующих циклах я не буду входить, если вы заходите в другое. Благодарю. – ant2009

2

В каждом языке программирования или синтаксисе, когда выполнение ввело одну ветвь условного выражения (в этом случае условное выражение #ifdef, даже если условие изменяется во время выполнения ветви, другие ветви никогда не будут выполнены.

Я уверен, что вы не ожидали бы, чтобы напечатать «Hello», не так ли?

if (i == 1) 
    i = 0; 
else 
    printf("Hello\n"); 

в основном то, что вы говорите, что код под else ветви всегда должны выполняться, то просто вытащите его из ветки, и поместите его прямо в треску e.

И компилятор, и исполнение выполняют только один проход через условные обозначения, как только совпадение найдено, они не выглядят дальше.

1

Подумайте об этом так: else часть следующего кода не выполняется, даже если x был установлен в false в разделе if.

Условие проверяется в самой строке if(x) - после того, как он входит в этот блок, он не пересчитывает каждый из последующих разделов else - компилятор уже принял решение по этому вопросу.

bool x = true; 
if(x) 
{ 
    //do something 
    x = false; 
} 
else 
{ 
    //else code 
} 
Смежные вопросы