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

时间:2016-10-17 15:43:11

标签: c pointers types qualifiers

如果我们有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的三重指针作为只读函数传递?

2 个答案:

答案 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中的constbar

这就是为什么&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标志。基本上我所拥有的不是真正的只读限定符,我需要另一个级别。