реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> непонятность с #define
romez777
сообщение Jul 22 2005, 08:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

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

Код
...
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
мы не попадаем. В чем ошибка?

Спасибо.
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 22 2005, 09:50
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Мне кажется, что все дело в
Код
#undef DEBUG

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


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
romez777
сообщение Jul 22 2005, 10:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Цитата(makc @ Jul 22 2005, 12:50)
Мне кажется, что все дело в
Код
#undef DEBUG

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

то есть #undef равно как и #define будут обработаны препроцессором независимо от if-then ?
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 22 2005, 11:32
Сообщение #4


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(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


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
gab
сообщение Jul 23 2005, 00:28
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 376
Регистрация: 30-06-04
Из: Moskow
Пользователь №: 218



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

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

PS: Лучше день потерять, зато потом... smile.gif
PPS: Серьёзно, сколько компиляторов - столько и правил. Но стандарт - главнее.


--------------------
serpents on the way to paradise -
dying for love, fighting for ages.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 09:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016