Сохранение определений препроцессора [дубликат] ⇐ C++
-
Anonymous
Сохранение определений препроцессора [дубликат]
возможный дубликат: < /strong>
Могу ли я переопределить макрос C ++, а затем определить его обратно? < /p>
< /blockquote>
Скажите, что у меня есть какой -то код, в котором используется имя Blah < /code> для переменной. Предположим, что Blah является обычным определением препроцессора во многих стандартных файлах заголовков (определено как 10), поэтому, если мой файл включен после какого -либо из них, код разрывается, потому что Blah преобразуется на 10; Поэтому я должен #undef blah . Но также другие заголовки могут зависеть от Blah , поэтому я должен восстановить Blah до исходного значения после того, как мой заголовок будет выполнен. Можно ли сделать что -то вроде этого: < /p>
#ifdef BLAH
#define BLAH_OLD BLAH
#undef BLAH
#endif
... code ...
// restore BLAH to 10
#ifdef BLAH_OLD
#define BLAH BLAH_OLD
#end
< /code>
? Это, конечно, не работает, потому что Blah не расширен до 10. Я пытался сделать что -то вроде < /p>
#define EXPAND_AGAIN(x) x
#define EXPAND(x) EXPAND_AGAIN(x)
#define BLAH_OLD EXPAND(BLAH)
< /code>
Но это тоже не работает, поскольку расширение принимается буквально и не расширяется. Я использую MSVC 2008/2010, но было бы прекрасно, если бы решение будет работать и на большинстве других компиляторов.
Подробнее здесь: https://stackoverflow.com/questions/412 ... efinitions
возможный дубликат: < /strong>
Могу ли я переопределить макрос C ++, а затем определить его обратно? < /p>
< /blockquote>
Скажите, что у меня есть какой -то код, в котором используется имя Blah < /code> для переменной. Предположим, что Blah является обычным определением препроцессора во многих стандартных файлах заголовков (определено как 10), поэтому, если мой файл включен после какого -либо из них, код разрывается, потому что Blah преобразуется на 10; Поэтому я должен #undef blah . Но также другие заголовки могут зависеть от Blah , поэтому я должен восстановить Blah до исходного значения после того, как мой заголовок будет выполнен. Можно ли сделать что -то вроде этого: < /p>
#ifdef BLAH
#define BLAH_OLD BLAH
#undef BLAH
#endif
... code ...
// restore BLAH to 10
#ifdef BLAH_OLD
#define BLAH BLAH_OLD
#end
< /code>
? Это, конечно, не работает, потому что Blah не расширен до 10. Я пытался сделать что -то вроде < /p>
#define EXPAND_AGAIN(x) x
#define EXPAND(x) EXPAND_AGAIN(x)
#define BLAH_OLD EXPAND(BLAH)
< /code>
Но это тоже не работает, поскольку расширение принимается буквально и не расширяется. Я использую MSVC 2008/2010, но было бы прекрасно, если бы решение будет работать и на большинстве других компиляторов.
Подробнее здесь: https://stackoverflow.com/questions/412 ... efinitions
Мобильная версия