C 预处理器 (cpp
) 似乎应该正确处理这段代码:
#define A 1 // hello there
int foo[A];
我希望将 A
替换为 1
。
A
被替换为 1//hello there
,这导致 cpp -std=c99 test.c< 的以下输出
:
# 1 "test.c"
int foo[1 // hello there];
它不是有效的 C,无法编译。
如何让 cpp
执行正确的替换?
编译器注意事项:在 mac 上使用最新(8.2.1,2016 年 12 月)Xcode 的 cpp
,所以我怀疑这是由于编译器过时所致。
最佳答案
令我有些惊讶的是,我可以使用 /usr 在我的 Mac(macOS Sierra 10.12.2;
这是 XCode Apple LLVM version 8.0.0 (clang-800.0.42.1)
)上重现该问题/bin/cppcpp
— 但不使用 GNU cpp
(我只使用 cpp
调用它)。
解决方法包括:
/usr/bin/gcc -E -std=c99 test.c
这使用 clang
包装器 gcc
来运行 C 预处理器并正确处理版本。您可以添加一个 -v
选项并查看它运行的内容;我没有看到它运行 cpp
本身(它运行 clang -cc1 -E
以及很多其他信息)。
您还可以使用:
clang -E -std=c99 test.c
这实际上是同一件事。
您也可以安装 GCC 并使用它来代替 XCode。有关于如何完成这项工作的问题和答案(但这不适合胆小的人)。
关于c - 如何让 Xcode 8 C 预处理器忽略//#defines 中的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41603784/