我遇到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;
有人可以向我解释为什么会这样吗?以及如何解决?有没有我可以通过的选项?
编辑:我还发现##(连接运算符)也不起作用!
答案 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
没有它就可以正常工作。