2017-07-10 107 views
2

运行clang为什么说_Imaginary_I没有声明?

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定义。发生了什么?

+0

另外'double _Complex z = 1.0 + _Imaginary_I * 2.0'不起作用。 – QuantumDot

+0

用'-std = c99'或'-std = c11'标志编译;一些编译器默认为C89模式 –

回答

2

虚数和_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

+0

是的,它的工作;另一个愚蠢的问题是:与_Complex double相当于double _Complex的声明?他们似乎都在编译。 (**编辑**:实际上,'_Compile double'不能与''函数一起工作,显然它是一种有效的类型,与''不兼容)。 – QuantumDot

+0

@QuantumDot'double _Complex'是通常的排序,但它应该完全等价于使用'_Complex double' –

+0

@QuantumDot:'_Compile'!='_Complex'可能是问题。 ;-) –

相关问题