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
没有它也能正常工作。
我在使用 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
没有它也能正常工作。