为什么clang说_Imaginary_I没有声明?

运行

clang test.c -o test 

在这个文件上

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

由于没有编译失败

 error: use of undeclared identifier '_Imaginary_I'. 

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

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

复数也是C11的可选function,但通常由实现支持。 I_Complex_I应该工作。


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

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

但是在实践中这不可靠,例如gcc定义宏而不支持该function 。