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

sin*_*law 6 c gcc

考虑:

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

void foo(void) {
    typeof(*"FOO") x[4];
    f(&x);
}
Run Code Online (Sandbox Code Playgroud)

编译-Wwrite-strings:

gcc-5 -c gcc5.c  -Wwrite-strings
Run Code Online (Sandbox Code Playgroud)

你得到:

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]);
      ^
Run Code Online (Sandbox Code Playgroud)

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

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

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

oua*_*uah 1

对我来说这确实是一个错误gcc 5

gcc 文件

-Wwrite-字符串

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

因此,有了这个声明:

typeof(*"FOO") x[4];
Run Code Online (Sandbox Code Playgroud)

then是when存在的&x类型。在标准 C 中,类型为。const char (*)[4]-Wwrite-strings&xchar (*)[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]));
}
Run Code Online (Sandbox Code Playgroud)

印刷:

1
0
Run Code Online (Sandbox Code Playgroud)

gcc 5.3-Wwrite-strings。所以我们可以看到gcc 5.3正确地识别为&x类型const char (*)[4]-Wwrite-strings

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

(这个错误可能没有在以前的版本中显示gcc,只是因为在以前的版本中gcc未能(另一个错误)识别&xconst char (*)[4]with 。我用和进行了测试。)-Wwrite-stringsgccgcc 4.9.2gcc-6-20151206