2017-01-13 48 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