Временно перезаписать макрос в препроцессоре C
Мне нужно временно перезаписать макрос, а затем восстановить его. Как:
#define FOO X
#save FOO
#define FOO Y
...
#restore FOO
Возможно ли это в стандартном препроцессоре C? В GCC?
ADDED. Пример реального мира. Я использую глобальный макрос для исключения ошибок. Он действует как assert
, но для постоянного использования не только для отладочных версий; поэтому, например, я обычно вызываю функции (с побочным эффектом) внутри макроса. Он определен один раз, но определение не является постоянным; поэтому я не знаю, априори. Для некоторой части кода мне нужна своя, модифицированная версия макроса, но я хочу сохранить общий стиль кода. Это выглядит некрасиво, когда одна часть кода использует один макрос, другая часть использует другой макрос - оба макроса имеют одну и ту же цель, но немного отличаются от реализации.
Итак, мне полезно сохранить исходный макрос временно, использовать другую версию для части кода, после чего восстановить исходный макрос.
Ответы
Ответ 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.