首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C中的双指针常量正确性警告

C中的双指针常量正确性警告
EN

Stack Overflow用户
提问于 2019-03-26 00:30:18
回答 2查看 0关注 0票数 0

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

代码语言:javascript
复制
int       *x = NULL;
int const *y = x;

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

代码语言:javascript
复制
int       *      *x = NULL;
int       *const *y = x; /* okay */
int const *const *z = y; /* warning */

-Wall但是,使用标志对GCC或Clang进行编译会产生以下警告:

代码语言:javascript
复制
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限定符“在嵌套指针类型中丢弃限定符”?

EN

回答 2

Stack Overflow用户

发布于 2019-03-26 09:00:21

之所以const只能添加一个级别的原因是微妙的,并且在comp.lang.c FAQ中问题11.10解释。

简而言之,请考虑与您的密切相关的此示例:

代码语言:javascript
复制
const int i;
int *p;
int const **z = &p;
*z = &i;
/* Now p points to i */

C通过仅允许在第一个指向级别丢弃限定符来避免此问题(因此z不允许在此处进行赋值)。

您的确切示例不会遇到此问题,因为const第二级意味着*z无论如何都不会允许分配。在这种情况下,C ++ 允许它,但C的更简单的规则不区分你的情况和上面的例子。

票数 0
EN

Stack Overflow用户

发布于 2019-03-26 09:44:09

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

代码语言:javascript
复制
int **x = whatever;
const int **z = x;

但是,您的代码const int *const *z = x;完全不同,并且它不会受到FAQ提出的相同缺陷的影响。

实际上,后一代码在概念上没有任何问题。它只是C规范中的一个缺陷,它是不允许的,它迫使C程序员在其代码中包含丑陋的强制转换。

C可以使用与C ++相同的规则; 但是C标准委员会并未决定这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档