2017-07-10 17 views
2

なぜclangは_Imaginary_Iが宣言されていないのですか?

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

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

onlinepubsによるので

error: use of undeclared identifier '_Imaginary_I'. 

のコンパイルに失敗し、このファイルには

clang test.c -o test 

を実行して、_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'と同じですか?彼らはどちらもコンパイルされているようだ。 (** Edit **:実際には、 '_Compile double'は' '関数では機能しません。これは有効な型で、' 'と互換性がありません)。 – QuantumDot

+0

@QuantumDot 'double _Complex'は通常の順序ですが、' _Complex double'を使うのと全く同じでなければなりません。 –

+0

@QuantumDot: '_Compile'!=' _Complex'が問題になります。 ;-) –

関連する問題