2017-10-21 10 views
3

x86およびx86_64マシンでint16_tをコンパイルしているのにint16_t complexがコンパイルされない理由は、short intのtypedefですか?以下は、gcc 5.4と4.9とC99とC11の両方の標準でテストされたサンプルコードです。コンパイラは、宣言指定子に2つ以上のデータ型を持つことについて不平を言います。なぜ 'int16_t complex'が機能しないのですか?

コード:

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

int main() 
{ 
    float complex x = I + I/3 * I/2; 
    short int complex y = I + I/3 * I/2; 
    int16_t complex z = I + I/3 * I/2;  /* Why ? */ 
    printf("x=(%+f,%+f)\n", creal(x), cimag(x)); 
    printf("y=(%+f,%+f)\n", creal(y), cimag(y)); 
    printf("z=(%+f,%+f)\n", creal(z), cimag(z)); /* Why ? */ 
    return 0; 
} 

エラー:

In file included from ./complex.c:1:0: 
./complex.c: In function ‘main’: 
./complex.c:9:13: error: two or more data types in declaration specifiers 
    int16_t complex z = I + I/3 * I/2;  /* Why ? */ 

コンパイラのコマンドライン:

gcc-5 --std=c99 ./complex.c -o ./complex 
gcc-4.9 --std=c99 ./complex.c -o ./complex 
+0

C99モード( '-std = c99')で実行しているときに' short int complex'が受け入れられますか?警告レベルを上げることを検討してください。 – alk

+0

@alkはい。 '--pedantic'と' -Wall -Werror'を使っても –

答えて

6

まず、複雑な整数型はGCC拡張です。 C標準は(C11 6.2.5p11)言う:

11 There are three complex types, designated as float _Complex , double _Complex , and long double _Complex .43) (Complex types are a conditional feature that implementations need not support; see 6.10.8.3.) The real floating and complex types are collectively called the floating types.

_Complexはちょうどlongように、タイプ名の一部です。ダブルのtypedefを使用している場合long doubleためldblためtypedefを定義しようとする

typedef double dbl; 
typedef long dbl ldbl; 

すなわち:あなたは、このいずれかを行うことはできません!同様に、複合タイプを定義するときにtypedefint16_tなど)を使用することはできません。代わりにshort int _Complexを使用してください。

(これはもちろん、_Complexに展開されるマクロなので、complexにも当てはまります)。

3

がありますというだけの理由そのようなタイプはありませんint16_t complex。 C11の有効な複合型は、float complex,double complexおよびlong double complexです。

complexは、実際のタイプ指定子であるマクロwhich expands to _Complexです。

+0

なぜ 'short int complex'と' int complex'はうまくいくのですか? –

+4

GCCは[複合整数型](https://gcc.gnu.org/onlinedocs/gcc/Complex.html)を拡張子としてサポートしていますが、これらは非標準です。 –

4

これは、_Complexがタイプ名自体の一部であり、他のタイプで使用できる修飾語ではないためです。 shortだけでなく、あらゆる種類のtypedefでは動作しません。たとえば、これを行う場合、

typedef float fp32; 
fp32 _Complex x = I + I/3 * I/2; 

同じコンパイルエラーが表示されます。

+0

それは面白いです。 C++/CLIに触発されたこの間隔のあるキーワードのコンセプトはありましたか? – IllidanS4

+0

@ IllidanS4はこれまで「unsigned char」について聞いています...これは** C **です。 –

+0

@AnttiHaapalaしかし、 'unsigned'はキーワードですね。それは多くの場所で修飾語であると述べられています。 – IllidanS4

関連する問題