C保护定义的宏

C Macro to protect definitions

本文关键字:定义 保护      更新时间:2023-10-16

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

#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应该有的值。

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

 #define X  1
 #pragma push_macro("X")
 #undef X
 #define X -1
 #pragma pop_macro("X")
 int x [X];
  • http://msdn.microsoft.com/en-us/library/hsttss76.aspx
  • http://gcc.gnu.org/onlinedocs/gcc/Push_002fPop-Macro-Pragmas.html

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

这意味着你可能必须"切碎"一个更大的文件,才能取出不应该受到宏影响的代码部分。是的,这很痛苦,但听起来无论如何都不应该与其他代码一起使用(否则就不会是问题)。