Подтвердить что ты не робот

Временно перезаписать макрос в препроцессоре C

Мне нужно временно перезаписать макрос, а затем восстановить его. Как:

#define FOO X
#save FOO
#define FOO Y
...
#restore FOO

Возможно ли это в стандартном препроцессоре C? В GCC?

ADDED. Пример реального мира. Я использую глобальный макрос для исключения ошибок. Он действует как assert, но для постоянного использования не только для отладочных версий; поэтому, например, я обычно вызываю функции (с побочным эффектом) внутри макроса. Он определен один раз, но определение не является постоянным; поэтому я не знаю, априори. Для некоторой части кода мне нужна своя, модифицированная версия макроса, но я хочу сохранить общий стиль кода. Это выглядит некрасиво, когда одна часть кода использует один макрос, другая часть использует другой макрос - оба макроса имеют одну и ту же цель, но немного отличаются от реализации.

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

4b9b3361

Ответ 1

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

#include "generalmacrodefs.h" // put them in here or include them indirectly
#undef macro1
#define macro1 "specialized temporary value"
#undef macro1
#include "generalmacrodefs.h" // restores

Это требует, чтобы generalmacrodefs.h использовал шаблон, подобный этому, по крайней мере, для определений, которые вы могли бы временно перезаписать:

#ifndef macro1
#define macro1 "original value"
#endif

Ответ 2

Ближе всего вы можете прийти в C, это директива #undef, которая просто отменяет макрос, позволяя его заменить:

#define FOO X

...

#undef FOO
#define FOO Y

...

#undef FOO
#define FOO X

Проблема в том, что вы не можете знать "старое" значение FOO после его переопределения - поэтому ваши значения должны быть жестко закодированы в одном месте.

Вы не можете создать макрос для сохранения значений для вас, так как невозможно создать макрос, который создает другие директивы препроцессора в стандартном C.