2017-07-10 152 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'可能是問題。 ;-) –

相關問題