如果我们有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 *
函数参数,但我想要更多的只读限定符而不仅仅是一个级别。
intent 是该函数假定传入的整个指针数据和指针是只读的,这样就不会以任何方式写入指针。
我知道该标志是一个额外的标志,但它被定义为:
-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的三重指针作为只读函数传递?
答案 0 :(得分:1)
为什么将
char*
传递给期望char const*
工作的函数?
理解这一点很简单。您无法修改被调用函数中的字符串。没关系。
为什么将
char**
传递给期望char const**
不起作用的函数?
这听起来不直观,但有一个原因。用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**
。
答案 1 :(得分:0)
<强> TL; DR:强>
const char * const **
- &gt; const char * const * const *
要完成这个问题,请在/ users / 2410359 / chux的评论中回答(要求他们发帖,但他们没有)。解决方案是使用const char * const * const *
,它不会触发-Wcast-qual
标志。基本上我所拥有的不是真正的只读限定符,我需要另一个级别。