C保护定义的宏
C Macro to protect definitions
有办法保护宏定义吗?更具体地考虑以下内容:
#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
文件中,而不将头文件包括在正在编译的源文件中。
这意味着你可能必须"切碎"一个更大的文件,才能取出不应该受到宏影响的代码部分。是的,这很痛苦,但听起来无论如何都不应该与其他代码一起使用(否则就不会是问题)。
相关文章:
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 使用标头保护的多个定义链接错误
- 在 C++17 中,是否未定义使用无锁原子学保护从信号处理程序传递的数据?
- C++对已继承的受保护类成员的未定义引用
- 如何检查是否定义了标头保护
- 自我复制、保护和破坏本地函数定义是非法的
- C++ 我是否需要为嵌套类定义标头保护
- CPP - 为什么监护人没有保护我免受多重定义的影响?
- 类型重定义错误(使用标头保护)
- 对受保护静态成员的未定义引用.我该如何解决
- 在派生类中定义自定义返回类型的受保护方法
- 标头保护仍然会产生重新定义错误
- C++包含保护和多个定义错误
- 与 IE 保护模式兼容的自定义工具栏
- 函数的多个定义,即使在包含保护中定义
- 是否可以在没有包含保护的情况下编写头文件,并且没有多个定义错误
- C保护定义的宏
- 为什么我的对象无法访问在公共基类中定义的另一个对象的受保护成员?
- 在受保护的匿名联合的匿名结构中定义的成员仍然公开可见
- 类中受保护的静态枚举的链接器错误,即使已经定义