How to backup #define macro value in C?

108 Views Asked by At

I want to backup macro value like below.

g++ ... -D_XOPEN_SOURCE=600 current _XOPEN_SOURCE value is 600

// xxx.h
#define _XOPEN_SOURCE 700 // redefine
#ifdef _XOPEN_SOURCE // 600
#define _XOPEN_SOURCE_BACK _XOPEN_SOURCE 
#undef _XOPEN_SOURCE // removed
#endif

#include "xxx.h" // changed to 700
// _XOPEN_SOURCE_BAKC will be changed to 700
#ifdef _XOPEN_SOURCE_BACK
#undef _XOPEN_SOURCE // removed
#define _XOPEN_SOURCE _XOPEN_SOURCE_BACK 
#endif

But as you know the _XOPEN_SOURCE_BACK value will be removed when #undef _XOPEN_SOURCE Is there any solution to store _XOPEN_SOURCE value using macro?

How to backup #define macro value in C?

2

There are 2 best solutions below

3
On BEST ANSWER

Maybe you can use an enum (a real constant known at compile time):

#include <stdio.h>

#define _XOPEN_SOURCE 600

enum { _XOPEN_SOURCE_BACK =
#ifdef _XOPEN_SOURCE // 600
    _XOPEN_SOURCE
#undef _XOPEN_SOURCE // removed
#else
    0
#endif
};

#define _XOPEN_SOURCE _XOPEN_SOURCE_BACK // redefine

int main(void)
{
    printf("%d\n", _XOPEN_SOURCE);
    return 0;
}

Output:

600
1
On

There is no way to do so in standard C, but gcc has an extension:

 #pragma push_macro("_XOPEN_SOURCE")
 #undef _XOPEN_SOURCE

 ...

 #pragma pop_macro("_XOPEN_SOURCE")