jml*_*pez 1 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
Run Code Online (Sandbox Code Playgroud)
在示例中,我放置了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
Run Code Online (Sandbox Code Playgroud)
缺点是我必须再次定义宏.说我想在我的程序中使用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
Run Code Online (Sandbox Code Playgroud)
我们的想法是检查宏是否存在,如果存在,那么我们希望将值存储到另一个变量中,取消定义宏,最后在需要时再次定义宏.不幸的是,这段代码不起作用,因为在我们执行代码段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];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |