Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: непонятность с #define
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
romez777
Приветствую.

Определяю макро таким образом:

Код
...
int main(int argc, char *argv[], char *envp[])
{
...
 if ( argc > 1 ) {
    if ( strcmp(argv[1], "-d") == 0 ) {
#define DEBUG 1
   printf("DEBUG value is %d\n", DEBUG);
    }
    else {
#undef DEBUG
    }
 }
...
#ifdef DEBUG
 ...
#endif
...
}


Макро определяется, но при этом в код заключенный в #ifdef DEBUG... #endif
мы не попадаем. В чем ошибка?

Спасибо.
makc
Мне кажется, что все дело в
Код
#undef DEBUG

Которое удаляет макроопределение из области видимости. Нужно иметь в виду, что оно никак не связано с if ..., т.к. if не обрабатывается в данном случае препроцессором.
romez777
Цитата(makc @ Jul 22 2005, 12:50)
Мне кажется, что все дело в
Код
#undef DEBUG

Которое удаляет макроопределение из области видимости. Нужно иметь в виду, что оно никак не связано с if ..., т.к. if не обрабатывается в данном случае препроцессором.
*

то есть #undef равно как и #define будут обработаны препроцессором независимо от if-then ?
makc
Цитата(romez777 @ Jul 22 2005, 13:01)
Цитата(makc @ Jul 22 2005, 12:50)
Мне кажется, что все дело в
Код
#undef DEBUG

Которое удаляет макроопределение из области видимости. Нужно иметь в виду, что оно никак не связано с if ..., т.к. if не обрабатывается в данном случае препроцессором.
*

то есть #undef равно как и #define будут обработаны препроцессором независимо от if-then ?
*



Именно. Это директивы препроцессора, который обрабатывает исходный текст программы до ее компиляции. А оператор if и ему подобные - это ключевые слова, которые обрабатываются компилятором, т.е. препроцессор их попросту трактует как текст.

Более того, это означает, что нижеприведенный пример будет замечательно работать:
Код
#define begin {
#define end }

int main()
begin
       return 0;
end
gab
Цитата(romez777 @ Jul 22 2005, 11:20)
Макро определяется, но при этом в код заключенный в #ifdef DEBUG... #endif
мы не попадаем. В чем ошибка?
*

Макросы не рекурсивны. Т.е. при разрешении макроса внутреннии макросы не вычисляются. И вычисляются отдельно от программы. ИМХО вроде так, согласно стандарту.
В общем, нужно строго следить за макросами и программой на С. Это _разные_ вещи. Прогоните в уме то как должна идти компиляция с т.з. поведения препроцессора и компилятора. Не допускайте вложения макроса в макрос.

PS: Лучше день потерять, зато потом... smile.gif
PPS: Серьёзно, сколько компиляторов - столько и правил. Но стандарт - главнее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.