为什么clang说_Imaginary_I没有被声明?

时间:2017-07-10 00:44:42

标签: c complex-numbers

运行

clang test.c -o test

在此档案

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

int main()
{
    _Complex double z = 1.0 + _Imaginary_I * 2.0;
    return 0;
}
由于

无法编译

error: use of undeclared identifier '_Imaginary_I'.

根据onlinepubs,定义了_Imaginary_I。发生了什么事?

1 个答案:

答案 0 :(得分:3)

虚数和_Imaginary_I是C标准中的可选功能。

复数也是C11的可选功能,但通常受实现支持。 I_Complex_I应该有效。

根据标准,您应该能够通过检查以下宏的值来在编译时测试一致性:

  • __STDC_IEC_559_COMPLEX__:值1表示存在复杂和虚构类型,符合IEC 60559。
  • __STDC_NO_COMPLEX__:值1表示既不存在复杂类型也不存在虚构类型。

然而在实践中,这是不可靠的,例如gcc defines the macro without supporting the feature