C中的双指针const正确性警告

指向非const数据的指针可以隐式转换为指向相同types的const数据的指针:

int *x = NULL; int const *y = x; 

添加额外的const限定符以匹配额外的间接参数应该在逻辑上以相同的方式工作:

 int * *x = NULL; int *const *y = x; /* okay */ int const *const *z = y; /* warning */ 

然而,用GCC或Clang编译这个与-Wall标志,会导致以下警告:

 test.c:4:23: warning: initializing 'int const *const *' with an expression of type 'int *const *' discards qualifiers in nested pointer types int const *const *z = y; /* warning */ ^ ~ 

为什么添加一个额外的const限定词“放弃嵌套指针types的限定符”?

const只能被添加一级的原因是微妙的, 在comp.lang.c FAQ中的问题11.10中有解释。

简而言之,考虑这个与您密切相关的例子:

 const int i; int *p; int const **z = &p; *z = &i; /* Now p points to i */ 

C通过只允许赋值放弃第一个指向的限定符来避免这个问题(所以不允许在这里赋值z )。

你的确切的例子不会遭受这个问题,因为第二个级别的const意味着分配给*z不会被允许。 C ++ 允许它在这种情况下,但C更简单的规则不区分你的情况和上面的例子。

通过其他答案链接的FAQ条目解释了为什么不允许使用以下代码:

 int **x = whatever; const int **z = x; 

但是,你的代码const int *const *z = x; 是完全不同的,它不会遇到常见问题解答提出的同样的缺陷。

事实上,后面的代码在概念上是没有问题的。 这只是C规范中的一个缺陷,它不被允许,并且迫使C程序员在其代码中包含丑陋的表演。

C有可能使用与C ++相同的规则; 但是C标准委员会并没有决定这么做。

Interesting Posts