在使用GCC进行编译时,我试图找出使用复杂文字的问题。考虑以下
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex z = CMPLX(0.0, -1.0);
printf("z = %.1f%+.1fin", creal(z), cimag(z));
return 0;
}
(从参考页略微修改(。如果我使用Clang进行编译,它会按预期工作。然而,如果我使用GCC,我会得到一个未定义的参考错误
gcc -std=c11 mwe.c
mwe.c: 6:24 warning: implicit declaration of function 'CMPLX' ...
mwe.c:(...) undefined reference to `CMPLX'
我已经在Linux上的GCC 4.7和7.2以及MacOS上的GCC 9中尝试过这一点。错误消息会发生变化,但最终结果保持不变。查看CMPLX
的参考,这应该是有效的C11。根据这个答案和这篇文章,GCC似乎以前接受过这个构造。
我的底线问题是:为什么我不能将CMPLX
与GCC一起使用?
这似乎是由我所拥有的系统上的头/库断开连接引起的。使用-save-temps
标志进行编译时,GCC似乎使用了complex.h
的系统标头。这意味着所选Xcode SDK的usr/include/complex.h
在MacOS上,/usr/include/complex.h
在Linux上。在MacOS上,CMPLX
宏仅在使用Clang时定义。我拥有的Linux是RHEL 6,这意味着标头针对的是没有CMPLX
的GCC 3。根据对这个错误报告的讨论,似乎确保宏的定义不符合GCC。
简单的答案是:编译器/平台组合不支持它。请使用本机编译器或更新系统。