CMPLX 使用 GCC 产生未定义的符号

Kei*_*ing 5 c gcc complex-numbers

我试图在使用 GCC 编译时使用复杂的文字来解决问题。考虑以下

#include <stdio.h>
#include <complex.h>

int main(void)
{
    double complex z = CMPLX(0.0, -1.0);
    printf("z = %.1f%+.1fi\n", creal(z), cimag(z));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(从参考页面稍微修改)。如果我用 Clang 编译,它会按预期工作。但是,如果我使用 GCC,我会收到未定义的引用错误

gcc -std=c11 mwe.c
mwe.c: 6:24 warning: implicit declaration of function 'CMPLX' ...
mwe.c:(...) undefined reference to `CMPLX'
Run Code Online (Sandbox Code Playgroud)

我已经在 Linux 上的 GCC 4.7 和 7.2 和 MacOS 上的 GCC 9 上尝试过这个。错误消息发生了变化,但最终结果保持不变。查看 的参考CMPLX,这应该是有效的 C11。根据这个答案这篇文章,似乎 GCC 之前接受了这个构造。

我的底线问题是:为什么我不能CMPLX与 GCC 一起使用?

Kei*_*ing 0

看来这是由我所拥有的系统上的标头/库断开连接引起的。使用该-save-temps标志进行编译,看来 GCC 使用complex.h. usr/include/complex.h这意味着MacOS 和/usr/include/complex.hLinux上所选的 Xcode SDK 。在 MacOS 上,CMPLX仅在使用 Clang 时定义宏。我的 Linux 是 RHEL 6,这意味着标头是针对 GCC 3 的,而 GCC 3 没有CMPLX. 根据此错误报告的讨论,看起来确保宏的定义不取决于 GCC。

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