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

C++ Preprocessor doesn't process define as expected

我在使用 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;

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


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

奇怪!您显然在 clang 预处理器中发现了一个错误!

我也可以在 OSX.

上重现此内容 (Apple LLVM version 8.1.0 (clang-802.0.42))

当您删除 #define(缩进)之前的 spaces 时,这也会按预期开始工作,但是领先的 spaces 根本不重要,而且很多编辑在 #ifdefs.

内缩进 #defines

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

即使这样也失败了(注意前导 space):

 #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 总是被忽略。

现在'solution':使用:

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

尽管它使用相同的 LLVM,但它按预期工作。

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

中的错误

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

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

顺便说一句:如果您的文件没有为 c++ 命令使用常规 c/c++ 扩展名,则需要添加 -x c++ 标志。 cpp 没有它也能正常工作。