gpt4 book ai didi

c - 为什么调用接受 (const char * const **) 和 char *** 的函数会引发 -Wcast-qual 标志?

转载 作者:行者123 更新时间:2023-11-30 15:04:54 27 4
gpt4 key购买 nike

如果我们有void foo(const char * const ** bar);我们用 char *** bar = malloc(...); 来调用它如foo((const char * const **) bar);它返回:

error: to be safe all intermediate pointers in cast from ‘char ***’ to ‘const char * const**’ must be ‘const’ qualified [-Werror=cast-qual]

尝试在不强制转换的情况下传递它会导致类型警告,但传递 char *进入const char * 有效,我还可以传递 char ***进入char ** const *函数参数,但我想要更多只读限定符而不仅仅是单个级别。

意图是该函数假设传入的整个指针数据和指针都是只读的,这样该指针就不会以任何方式写入。

我知道该标志是一个额外的标志,但它的定义为:

-Wcast-qual

Warn whenever a pointer is cast so as to remove a type qualifier from the target type. For example, warn if a const char * is cast to an ordinary char *.

据我所知,没有类型限定符被删除,而是我们添加类型限定符来让用户知道该函数不会更改任何数据。

为什么前面提到的代码会触发额外警告 -Wcast-qual?是否有更好的方法将完全 malloc 的三重指针作为只读函数传递? p>

最佳答案

Why does passing a char* to a function that expects a char const* work?

这个道理很容易理解。您无法修改被调用函数中的字符串。没关系。

Why does passing a char** to a function that expects a char const** not work?

这听起来不直观,但这是有原因的。以 int 进行类比.

const int a = 10;
void foo(int const ** ap)
{
*ap = &a;
}

void bar()
{
int * p = NULL;
foo(&p);
*p = 20;
}

如果您被允许使用它,您可以修改 a ,即const ,在 bar间接地。

这就是为什么 &p ,其类型为int** , 不允许转换为 int const**隐式地。

关于c - 为什么调用接受 (const char * const **) 和 char *** 的函数会引发 -Wcast-qual 标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40090571/

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