Temporarily overwrite a macro in C preprocessor

The closest you can come in C is the #undef directive, which simply undefines the macro, allowing it to be replaced:

#define FOO X

...

#undef FOO
#define FOO Y

...

#undef FOO
#define FOO X

The problem is that you cannot know the 'old' value of FOO once you redefine it - so your values must be hard-coded in one place.

You cannot create a macro to save the values for you either, as it isn't possible to have a macro that creates other preprocessor directives in standard C.


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.


As already said, it is not really possible. Depending on the situation, this might be a workaround:

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

This requires that generalmacrodefs.h uses a pattern like this at least for the definitions you might temporarily overwrite:

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