使用-Wwrite-strings时,在GCC 5中键入与自身不兼容的类型

时间:2015-12-23 15:05:07

标签: c gcc

考虑:

char f(const char (*x)[4]);

void foo(void) {
    typeof(*"FOO") x[4];
    f(&x);
}

使用-Wwrite-strings编译:

gcc-5 -c gcc5.c  -Wwrite-strings

你得到:

gcc5.c: In function ‘foo’:
gcc5.c:5:7: warning: passing argument 1 of ‘f’ from incompatible pointer type [-Wincompatible-pointer-types]
     f(&x);
       ^
gcc5.c:1:6: note: expected ‘const char (*)[4]’ 
   but argument is of type ‘const char (*)[4]’
 char f(const char (*x)[4]);
      ^

看起来像gcc中的错误,除非我遗漏了什么?

注意:-Wwrite-strings更改文字字符串的类型:

  

编译C时,给字符串常量类型" const char [length]"

1 个答案:

答案 0 :(得分:1)

对我而言,这确实是gcc 5中的错误。

gcc documentation

  

-Wwrite串

     

编译C时,给字符串常量指定const char [length]类型,以便将一个地址复制到非const char *指针中会产生警告。

所以声明:

typeof(*"FOO") x[4];

&x出现时,const char (*)[4]的类型为-Wwrite-strings。在标准C中,&x的类型为char (*)[4]

这个小功能:

void foo(void) {
    typeof(*"FOO") x[4];
    printf("%d\n", __builtin_types_compatible_p(typeof(&x), const char (*)[4]));
    printf("%d\n", __builtin_types_compatible_p(typeof(&x), char (*)[4]));
}

打印:

1
0

gcc 5.3-Wwrite-strings。因此,我们可以看到gcc 5.3使用&x正确识别const char (*)[4]类型-Wwrite-strings

然后

gcc在调用具有&x参数的函数时接受参数const char (*)[4]。不兼容类型的警告是恕我直言,然后是gcc中的错误。

(此错误可能未在先前版本的gcc中显示,因为gcc失败(另一个错误)将&x标识为const char (*)[4] -Wwrite-strings在之前的gcc版本中。我使用gcc 4.9.2gcc-6-20151206进行了测试。)