gpt4 book ai didi

c - 不兼容的指针类型和常量

转载 作者:行者123 更新时间:2023-11-30 17:12:18 26 4
gpt4 key购买 nike

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

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

如果我从 test_function 的原型(prototype)中删除 const,警告就会消失。但这并不是我真正想要的。

当使用 clang 和 -pedantic-errors-Wall 进行编译时,我没有收到任何关于指针不兼容的警告。

我只是想了解为什么 gcc 在这种情况下会输出这样的警告。为什么我的指针/数组不兼容?

最佳答案

GCC 的标准是正确的,而 Clang 是错误的。

6.3.2.3/2:

For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to the q-qualified version of the type;

看起来很有前途。但请坚持住。

6.2.5/26:

A derived type is not qualified by the qualifiers (if any) of the type from which it is derived

专门应用于数组的标准规定是不必要的,并且可以很容易地逆转。也就是说,const char[3] 可以轻松地成为 char[3] 的 const 限定版本。但事实并非如此。它们只是不同的、不兼容的类型。事实上,C 中根本没有 const 限定的数组类型,因此您不能拥有 char[3] 的 const 限定版本。这是我们拥有并且必须遵守的标准。

关于c - 不兼容的指针类型和常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31635415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com