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标准委员会并没有决定这么做。