有没有办法保护宏定义? 更具体地考虑以下内容:
#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
文件中,而不是将头文件包含在正在编译的源文件中。
这意味着您可能必须“删除”一个更大的文件,以获得不应受宏影响的代码段。 是的,这是一个痛苦,但听起来它不应该与代码的其余部分(或它不会是一个问题)。
GCC和MSVC允许您使用pragma来推送和弹出宏定义:
#define X 1 #pragma push_macro("X") #undef X #define X -1 #pragma pop_macro("X") int x [X];
以上就是c/c++开发分享C Macro保护定义相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/523103.html