2017-01-13 16 views
4

ドキュメントによれば、私はC99以降を読んでfloat complexdouble complexおよびlong double complexを複合型としてサポートしています。ただし、このコードはgcc -Wall -Wextraを使用すると警告なしでコンパイルされます。C言語での 'complex'のデフォルトのタイプ

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

int main() { 
    int a, b, c, d; 
    float re, im; 

    scanf("%d %d", &a, &b); 
    complex matrix[a][b]; /* <------ */ 

    for(c=0; c<a; c++) { 
     for(d=0; d<b; d++) { 
      scanf("%f%fi", &re, &im); 
      matrix[c][d] = re + im * I; 
     } 
    } 

    for(c=0; c<a; c++) { 
     for(d=0; d<b; d++) { 
      printf("%.2f%+.2fi ", creal(matrix[c][d]), cimag(matrix[c][d])); 
     } 
     printf("\n"); 
    } 
} 
  • この有効なCですかそれはgccの風変わりですか?
  • complex matrix[a][b];はどのタイプですか?

あなたが打ち鳴らすとそれをコンパイルする場合は、取得:

のmain.c:5:9警告:平野 '_Complexは、' 型指定が必要です。 と仮定すると '_Complex double'

clang outputを参照してください。


gccのバグがthis linkに報告されました。 (私ではありません)

答えて

3

GCCとClangのように見えますが、省略した場合はdoubleとなります(例のように)。 クランが生成する:

warning: plain '_Complex' requires a type specifier; assuming '_Complex double' 
    complex matrix[a][b]; 
    ^
      double 
/usr/include/complex.h:39:18: note: expanded from macro 'complex' 
#define complex   _Complex 
         ^

をしながらGCCは(doubleを想定)と同じ、それを警告するようには思えないんありません。 _Complexに展開さにかかわらず、コンパイラの診断の

complexは、それ自体でタイプだけ型指定ではありません。したがって、タイプを指定する必要があります。

+1

ありがとうございました。 gccが二重と仮定する方法を教えてください。 – eleanora

+0

GCCの[typeof](https://gcc.gnu.org/onlinedocs/gcc/Typeof.html)を使用します。 – usr

+0

この場合、gccのバグのように見えます。本当にありがとう。 – eleanora

4

は、C99(ISO 9899:1999)によれば

  • complex_Complex(7.3.1/2)に展開(<complex.h>で定義された)マクロです。

  • _Complexは、型指定(同じようintdoubleunsignedなど)(6.7.2/1)です。

6.7.2/2:

制約

少なくとも型指定は、各宣言で宣言指定子に与えなければならない1、及び指定子修飾子リスト内で各構造体の宣言と型名。型指定子の各リストは、以下のセットの1つでなければなりません(1行に複数のセットがある場合はコンマで区切ります)。型指定子は任意の順序で出現する可能性があり、他の宣言指定子と混在する可能性があります。

  • [...]

  • float _Complex

  • double _Complex
  • long double _Complex

これらfloatせずcomplexdouble、又はlong doubleが許可されていないことを意味する、_Complexを含むのみ型指定のセットです。さらに

5.1.1.3診断

1 A(実装定義の方法で同定された)少なくとも1つの診断メッセージを作成しなければならない適合実装する場合、前処理変換ユニットまたは変換ユニットたとえその動作が明示的に が未定義または実装定義として指定されていても、構文ルールまたは制約の違反が含まれています。

complexを単独で使用すると制約違反が発生するため、コンパイラの警告またはエラーが必要です。 gcc -std=c99 -pedanticという警告が表示されない場合は、gccにバグがあります。

+0

'gcc -Wsystem-headers -Wpedantic readcomplex.c'を使って警告を受け取ります。 "複雑な"マクロはシステムヘッダに定義されているので、gccはそれに関連する診断を非表示にするべきだと思っています。 – eleanora

+0

@eleanoraうん、それは間違いなく私のバグのように見える。 – melpomene

関連する問題