C宏保护定义

时间:2012-02-22 20:09:06

标签: c++ c c-preprocessor

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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