Epr*_*pro 17 c++ save c-preprocessor
可能重复:
我可以重新定义C++宏然后再定义它吗?
假设我有一些使用BLAH变量名称的代码.假设BLAH在许多标准头文件(定义为10)中是一个常见的预处理器定义,所以如果我的文件包含在其中任何一个之后,代码就会因为BLAH转换为10而中断; 因此,我必须#undef BLAH.但是其他标头也可能依赖于BLAH,所以我必须BLAH在标头完成后恢复到它的原始值.有可能做这样的事情:
#ifdef BLAH
#define BLAH_OLD BLAH
#undef BLAH
#endif
... code ...
// restore BLAH to 10
#ifdef BLAH_OLD
#define BLAH BLAH_OLD
#end
Run Code Online (Sandbox Code Playgroud)
?这当然不起作用,因为BLAH没有扩展到10.我尝试过做类似的事情
#define EXPAND_AGAIN(x) x
#define EXPAND(x) EXPAND_AGAIN(x)
#define BLAH_OLD EXPAND(BLAH)
Run Code Online (Sandbox Code Playgroud)
但这也不起作用,因为EXPAND是字面意义而不是扩展.我正在使用MSVC 2008/2010,但如果该解决方案也适用于大多数其他编译器,那将是可爱的.
yon*_*evy 27
是的,假设你的编译器支持push/pop宏指令(visual c ++,gcc,llvm都这样做):
#define BLAH 10
#pragma push_macro("BLAH")
#undef BLAH
#define BLAH 5
...
#pragma pop_macro("BLAH")
Run Code Online (Sandbox Code Playgroud)
Jay*_*Jay -3
对我有用的一个技巧是在类中使用枚举。
class foo
{
public:
enum { blah = 10 } myenum;
}
Run Code Online (Sandbox Code Playgroud)
然后你就可以使用
foo:blah
Run Code Online (Sandbox Code Playgroud)
当你需要“10”时。
由于它是类的一部分,因此“blah”的其他用法不会发生冲突,并且您可以保存所有 def'ing 和 undef'ing。