有没有办法保护宏定义?更具体地考虑以下内容:
#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应该具有的值。
答案 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
中,而不是在源文件中包含头文件,而该文件正在编译中。
这意味着您可能需要“删除”一个更大的文件,以获得不应受宏影响的代码段。是的,这是一种痛苦,但听起来它不应该与其余代码一起使用(或者它不会是一个问题)。