考虑:
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]"
答案 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.2
和gcc-6-20151206
进行了测试。)