C++ C宏来保护定义
有没有办法保护宏定义?更具体地考虑如下:C++ C宏来保护定义,c++,c,c-preprocessor,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实例
#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
中,而不将头文件包含在正在编译的源文件中
这意味着您可能需要“切碎”一个更大的文件,以获得不受宏影响的代码段。是的,这是一种痛苦,但听起来似乎它无论如何都不应该与其余的代码在一起(否则这不会是一个问题)。使代码块不受宏影响的最简单方法是将宏放在头文件
.h
文件中,而不将头文件包含在正在编译的源文件中
这意味着您可能需要“切碎”一个更大的文件,以获得不受宏影响的代码段。是的,这是一种痛苦,但听起来似乎它不应该与代码的其余部分一起使用(否则这不会是一个问题)。
#define X 1
#pragma push_macro("X")
#undef X
#define X -1
#pragma pop_macro("X")
int x [X];
#define X 1
#pragma push_macro("X")
#undef X
#define X -1
#pragma pop_macro("X")
int x [X];