2017-01-13 26 views
4

根据我已阅读C99和更高版本支持float complex,double complexlong double complex作为复杂类型的文档。但是,使用gcc -Wall -Wextra时,此代码在没有警告的情况下编译。C中'复杂'的默认类型

#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:9:5:警告:纯 '_Complex' 需要类型说明符;假设'_Complex double'

查看clang output


gcc bug现在在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.h>定义)扩展为_Complex(7.3.1/2)。

  • _Complex是一个类型说明符(就像intdoubleunsigned等)(6.7.2/1)。

6.7.2/2:

约束

至少一个类型说明应在每个声明的声明说明符中给出,并在说明符限定符列表每个结构声明和类型名称。类型说明符的每个列表应该是以下集合中的一个(用逗号分隔,当一行上有多个集合时);类型说明符可能以任何顺序出现,可能与其他声明说明符混合在一起。

  • [...]

  • float _Complex

  • double _Complex
  • long double _Complex

这些是包含_Complex,这意味着complex而不floatdouble,或long double是不允许的唯一类型说明符集。

此外:

5.1.1.3诊断

1一致性实现应产生至少一个诊断消息(在一个实现定义的方式来识别),如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的情况,即使该行为也明确指定为未定义或实现定义的 。

由于使用complex本身就是违反约束条件,所以需要编译器警告或错误。如果您没有收到gcc -std=c99 -pedantic的警告,那么您在gcc中发现了一个错误。

+0

您使用'gcc -Wsystem-headers -Wpedantic readcomplex.c'得到警告。 “复杂”的宏在系统头文件中定义,所以gcc认为与它有关的诊断应该被隐藏......这是愚蠢的。 – eleanora

+0

@eleanora是的,这绝对看起来像一个bug。 – melpomene