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];

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

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

我宁愿远离仅用于gcc和microsoft的宏定义。有什么通用的吗?我宁愿远离只用于gcc和microsoft的宏定义。一般来说有什么问题吗?