指针类型和常量不兼容

朱利安·塞里

我有一个函数,使用静态二维数组并将数组元素的元素视为常量:

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]);

如果我consttest_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章