【发布时间】:2011-05-06 21:37:30
【问题描述】:
假设我有一些代码使用名称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
?这当然行不通,因为 BLAH 没有扩展到 10。我试过做类似的事情
#define EXPAND_AGAIN(x) x
#define EXPAND(x) EXPAND_AGAIN(x)
#define BLAH_OLD EXPAND(BLAH)
但这也不起作用,因为 EXPAND 是按字面意思而不是展开的。我正在使用 MSVC 2008/2010,但如果该解决方案也适用于大多数其他编译器,那就太好了。
【问题讨论】:
-
你考虑过改变你的变量命名吗?
-
更改变量名;如果这是一个问题,您将在那里进行可怕的约定。不如说“这是我要解决的实际问题”,而不是“让我们说”。
-
您确实意识到,几乎从一开始就有一个约定,即所有大写的标识符都保留给预处理器使用(以避免这样的事情)。
标签: c++ save c-preprocessor