C Macro保护定义

有没有办法保护宏定义? 更具体地考虑以下内容:

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

在示例中,我放置了3条注释,表示涉及宏的代码段。 我现在想做的是能够避免宏影响代码段2.有没有办法告诉编译器替换段1和段3中的所有macro1实例而不是段2中的宏实例? 这是一种可能的方式:

 #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 

缺点是我必须再次定义宏。 说我想在我的程序中使用NULL这个词(不要问我为什么要用它)。 我希望这是一个变量,但在大多数情况下,C预处理器会将其更改为0。 所以我想做的是,能够在短时间内阻止它,然后让它成为以前的样子。

尝试失败:

让我们假设macro1已在外部定义,我们甚至不知道这个宏的值是什么。 我们想要的只是避免让它替换第二段中的东西。

 // 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 

我们的想法是检查宏是否存在,如果存在,那么我们希望将值存储到另一个变量中,取消定义宏,最后在需要时再次定义宏。 不幸的是,这段代码不起作用,因为在我们执行代码段3之前,macro1将被TEMP替换,而不是TEMP应该拥有的值。

让一大块代码不受宏影响的最简单方法是将宏放在头.h文件中,而不是将头文件包含在正在编译的源文件中。

这意味着您可能必须“删除”一个更大的文件,以获得不应受宏影响的代码段。 是的,这是一个痛苦,但听起来它不应该与代码的其余部分(或它不会是一个问题)。

GCC和MSVC允许您使用pragma来推送和弹出宏定义:

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