C ++预处理器不按预期处理定义

时间:2017-09-01 13:28:06

标签: c++ macros clang preprocessor

我遇到cpp预处理器问题。我有这样的Input.h文件:

#ifndef PLATFORM_MOBILE1111
    #define MyTest WEB111
#endif 

int MyTest;

我使用此命令处理它(在OSX上):

cpp -E -P Source/Input.h Generated/Output.h

我明白了:

    #define MyTest WEB111


int MyTest;

即。 宏MyTest未获得应用。为什么?

经过一系列的实验,我发现如果我在#ifndef行之后插入一个空行,变量定义,注释或任何其他行 - 那么它可以正常工作。

#ifndef PLATFORM_MOBILE1111

    #define MyTest WEB111
#endif 

int MyTest;

所以上面的输入被正确处理成:

int WEB111;

有人可以向我解释为什么会这样吗?以及如何解决?有没有我可以通过的选项?

编辑:我还发现##(连接运算符)也不起作用!

2 个答案:

答案 0 :(得分:3)

奇怪!您清楚地发现了clang预处理器中的错误!

我也可以在OSX上重现这个(Apple LLVM version 8.1.0 (clang-802.0.42))。

当您在#define(缩进)之前移除空格时,这也会按预期开始工作,但前导空格根本不重要,并且很多编辑在#defines内缩进#ifdefs

有关正在发生的事情的一个提示是,在伪造的版本中,#define仍然存在于已处理的源代码中,而在正确的版本中则不然。显然,预处理器根本不认识#define

即便失败(注意领先空间):

 #define MyTest WEB111
int MyTest;

虽然这可以按预期工作:

#define MyTest WEB111
int MyTest;

这导致WEB222:

 #define MyTest WEB111
 #define MyTest WEB222
int MyTest;

虽然这会产生WEB111:

#define MyTest WEB111
 #define MyTest WEB222
int MyTest;

疯狂!1 !! : - )

似乎总是第一个缩进#define被忽略。

现在'解决方案':使用:

gcc -E Source/Input.cpp -P -o Generated/Output.cpp

虽然它使用相同的LLVM,但它按预期工作。

所以我假设gcc可执行文件以不同于cpp的方式初始化预处理器。这仍然是cpp中的错误。

答案 1 :(得分:1)

我发现通过c++而不是cpp运行预处理器可以解决我的两个问题:

c++ -E -P Source/Input.h Generated/Output.h

顺便说一句:如果你的文件没有使用-x c++命令的常规c / c ++扩展,你需要添加c++标志。 cpp没有它就可以正常工作。

相关问题