c-CMPLX使用GCC生成未定义的符号



在使用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。

简单的答案是:编译器/平台组合不支持它。请使用本机编译器或更新系统。

最新更新