Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Temporarily overwrite a macro in C preprocessor

I need to temporarily overwrite a macro and then restore it. Like:

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

Is it possible in standard C preprocessor? In GCC?

ADDED. About real world example. I use a global macro for error exception. It acts like assert, but for persistent usage, not only for debug versions; so, for example, I usually call functions (with side-effect) inside the macro. It's defined once, but the definition isn't persistent; therefore I don't know it a-priori. For some piece of code I need its own, modified version of the macro, but I want to save general style of code. It's looks ugly when one part of code uses the one macro, other part uses other macro -- both macros have the same purpose, but slightly different implementation.

So, it's good for me to save original macro temporarily, use different version for a part of code, after that restore original macro.


1 Answers

This is possible with #pragma push_macro and #pragma pop_macro. These are not standard C—they're originally an MSVC extension—but clang supports them, and so does GCC.

Example usage:

int main() {
#define SOME_MACRO 1
  printf("SOME_MACRO = %d\n", SOME_MACRO);
#pragma push_macro("SOME_MACRO")
#define SOME_MACRO 2
  printf("SOME_MACRO = %d\n", SOME_MACRO);
#pragma pop_macro("SOME_MACRO")
  printf("SOME_MACRO = %d\n", SOME_MACRO);
  return 0;
}

prints:

SOME_MACRO = 1
SOME_MACRO = 2
SOME_MACRO = 1

You can also #undef a macro inside a push_macro / pop_macro pair, and the pop_macro call will redefine it.

like image 102
nornagon Avatar answered Sep 09 '25 02:09

nornagon