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
进行正确的更换?
关于编译器的注意事项:使用cpp
mac上最新的(8.2.1,2016年12月)Xcode,所以我怀疑它是由于过时的编译器.
令我惊讶的是,我可以在Mac上重现问题(macOS Sierra 10.12.2; Apple LLVM version 8.0.0 (clang-800.0.42.1)
)使用/usr/bin/cpp
哪个是XCode cpp
- 但不使用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.关于如何完成这项工作的答案存在问题(但这不适合胆小的人).