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

CMPLX Yields Undefined Symbol with GCC

我试图找出在使用 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;
}

(从 the reference page 稍作修改)。如果我用 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 进行了尝试。错误消息发生变化,但最终结果保持不变。查看 , this should be valid C11. Based on and this post,GCC 似乎以前接受过此构造。

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

这似乎是由于我的系统 header/library 断开连接所致。使用 -save-temps 标志编译,GCC 似乎使用系统 header 作为 complex.h。这意味着所选 Xcode SDK 在 MacOS 上的 usr/include/complex.h 和 Linux 上的 /usr/include/complex.h。在 MacOS 上,CMPLX 宏仅在使用 Clang 时定义。我拥有的 Linux 是 RHEL 6,这意味着 header 是针对没有 CMPLX 的 GCC 3。根据 this bug report 上的讨论,确保宏的定义似乎不是由 GCC 决定的。

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