我有一个函数,使用静态二维数组并将数组元素的元素视为常量:
void test_function(const char arr[3][3]);
我试图调用这样的函数,如下所示:
char my_var[3][3] = { {0, 0, 0}, {0, 0, 0}, {0, 0, 0} };
test_function(my_var);
使用gcc编译时(不带任何标志),我收到以下警告:
test.c:9:8: warning: passing argument 1 of 'test_function' from incompatible pointer type
test_function(my_var);
^
test.c:4:6: note: expected 'const char (*)[3]' but argument is of type 'char (*)[3]'
void test_function(const char arr[3][3]);
如果我const
从test_function
的原型中删除,警告就会消失。但这不是我真正想要的。
当两者都用clang编译时-pedantic-errors
,-Wall
我没有收到有关指针不兼容的任何警告。
我只是想了解为什么在这种情况下gcc输出这样的警告。为什么我的指针/数组不兼容?
GCC符合标准,而Clang是错误的。
6.3.2.3/2:
对于任何限定词q,可以将指向非q限定类型的指针转换为指向q限定类型的指针;
看起来很有前途。但是等一下。
6.2.5 / 26:
派生类型不受派生类型的限定符(如果有)的限制
专门用于数组的标准规定不是必需的,可以很容易地颠倒过来。也就是说,const char[3]
可以很容易地制成const限定版本char[3]
。但事实并非如此。它们只是不同的,不兼容的类型。实际上,C中根本没有const限定的数组类型,因此您不能拥有const限定的版本char[3]
。这是我们必须遵守的标准。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句