Задать вопрос
@q27off

Как задать поведение препроцессора C в GCC?

Здравствуйте.

Имеется некий код:

#ifdef func
#define temp func
#undef func
#endif

// тут выполняется какой-то код

#ifdef temp
#define func temp
#undef temp
#endif


Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

Проблема заключается в том, что на одной машине GCC отрабатывает ожидаемым образом, а на другой, func раскрывается буквально в temp, и в stderr выводится куча предупреждений вида undefined function temp.

Есть ли способы задать жестко алгоритм поведения препроцессора, чтобы во втором определении func соответствовало значение temp, а не название макроса (temp). Возможно, какие-то флаги компиляции отвечают за данное поведение?

Заранее благодарен за ответы.
  • Вопрос задан
  • 174 просмотра
Подписаться 2 Средний 6 комментариев
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

Таким образом этого сделать нельзя. Потому что в месте где написано #define temp func значение макроса func не подставляется. В temp попадает буквально слово func. После #undef func содержимое макроса func будет потеряно. Это поведение предписано стандартом, мне неизветсны опции компилятора, которыми его можно было бы изменить. См. eelis.net/c++draft/cpp.replace#10 и eelis.net/c++draft/cpp.rescan

Но если внести ещё один уровень косвенности, то можно сделать чтобы это работало. Например:
#define foo bar
#define func foo
...
#undef func
...
#define func foo
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы