Возможный дубликат:
Могу ли я переопределить макрос С++ и определить его обратно?
Скажем, у меня есть код, который использует имя BLAH
для переменной. Предположим, что BLAH
- это общее определение препроцессора во многих стандартных файлах заголовков (определено как 10), поэтому, если мой файл включен после любого из них, код разбивается, потому что BLAH
преобразуется в 10; поэтому я должен #undef BLAH
. Но и другие заголовки могут зависеть от BLAH
, поэтому я должен восстановить BLAH
его исходное значение после завершения моего заголовка. Можно ли сделать что-то вроде этого:
#ifdef BLAH
#define BLAH_OLD BLAH
#undef BLAH
#endif
... code ...
// restore BLAH to 10
#ifdef BLAH_OLD
#define BLAH BLAH_OLD
#end
? Это не работает, конечно, потому что BLAH не расширен до 10. Я пробовал делать что-то вроде
#define EXPAND_AGAIN(x) x
#define EXPAND(x) EXPAND_AGAIN(x)
#define BLAH_OLD EXPAND(BLAH)
но это тоже не работает, поскольку EXPAND воспринимается буквально и не расширяется. Я использую MSVC 2008/2010, но было бы прекрасно, если бы решение работало и на большинстве других компиляторов.