C macro para proteger definiciones

¿Hay una manera de proteger una definición de macro? Para ser más específicos considere lo siguiente:

#define macro1 x // code segment 1 involving macro1 goes here // code segment 2 involving macro1 goes here // code segment 3 involving macro1 goes here 

En el ejemplo, he colocado 3 comentarios que denotan segmentos de código relacionados con la macro. Lo que me gustaría hacer ahora es poder evitar que la macro afecte al segmento de código 2. ¿Hay alguna forma de decirle al comstackdor que reemplace todas las instancias de macro1 en el segmento 1 y el segmento 3 pero no en el segmento 2? Aquí es una forma posible:

 #define macro1 x // code segment 1 involving macro1 goes here #undef macro1 // code segment 2 involving macro1 goes here #define macro1 x // code segment 3 involving macro1 goes here 

El inconveniente es que tengo que definir la macro de nuevo. Digamos que quería usar la palabra NULL en mi progtwig (no me preguntes por qué solo sigue). Quiero que esto sea una variable, pero el preprocesador C lo cambiará a 0 en la mayoría de los casos. Entonces, lo que quiero hacer es poder bloquearlo por un corto período de tiempo y luego dejar que sea lo que era antes.

Intento fallido:

Supongamos que macro1 se ha definido en algún lugar externo y ni siquiera sabemos cuál es el valor de dicha macro. Todo lo que queremos es evitar que reemplace las cosas en el segundo segmento.

 // code segment 1 involving macro1 goes here #ifdef macro1 #define TEMP macro1 #undef macro1 #endif // code segment 2 involving macro1 goes here #ifdef TEMP #define macro1 TEMP #undef TEMP #endif // code segment 3 involving macro1 goes here 

La idea es verificar si la macro existe, si es así, entonces queremos almacenar el valor en otra variable, deshacer la definición de la macro y, finalmente, definir la macro nuevamente cuando la necesitemos. Desafortunadamente, este código no funciona porque antes de que ejecutemos el código 3, la macro1 será reemplazada por TEMP, no por el valor que se suponía que tenía TEMP.

La forma más fácil de que una macro no afecte a una parte del código es colocar la macro en un archivo de encabezado .h y NO incluir el archivo de encabezado en el archivo de origen que se está comstackndo.

Esto significa que podría tener que “cortar” un archivo más grande para obtener su sección de código que no debería verse afectada por la macro. Sí, es un dolor, pero parece que no debería estar con el rest del código de todos modos (o no sería un problema).

GCC y MSVC le permiten usar un pragma para insertar y abrir definiciones de macros:

  #define X 1 #pragma push_macro("X") #undef X #define X -1 #pragma pop_macro("X") int x [X];