gpt4 book ai didi

c++ - 保护定义的 C 宏

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:28:11 25 4
gpt4 key购买 nike

有没有办法保护宏定义?更具体地考虑以下内容:

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

关于c++ - 保护定义的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9402174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com