首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嘎吱作响,gcc,忽略了限定词:谁是对的?

嘎吱作响,gcc,忽略了限定词:谁是对的?
EN

Stack Overflow用户
提问于 2021-02-26 15:03:19
回答 1查看 244关注 0票数 1

在编译BoringSSL时,我发现gcc和clang在行为上存在差异,并能够将其简化为下面的测试用例来说明:

代码语言:javascript
复制
typedef char *OPENSSL_STRING;
#if USE_TYPEDEF
#define constptr const OPENSSL_STRING
#else
#define constptr const char *
#endif

int
foo (const void **ap)
{
    constptr a = (constptr) *ap;
    return a != 0;
}

我测试了以下四种场景:

代码语言:javascript
复制
sh$ g++ -c t2.cc -Wignored-qualifiers -DUSE_TYPEDEF
t2.cc: In function ‘int foo(const void**)’:
t2.cc:11:30: warning: type qualifiers ignored on cast result type [-Wignored-qualifiers]
   11 |     constptr a = (constptr) *ap;
      |                              ^~
sh$ g++ -c t2.cc -Wignored-qualifiers 
sh$ clang++ -c t2.cc -Wignored-qualifiers -DUSE_TYPEDEF
sh$ clang++ -c t2.cc -Wignored-qualifiers 
sh$ 

这是gcc的问题吗?还是还有什么事情我不明白?

供参考:警告为在BoringSSL的stack.h中

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-26 15:08:07

在给定const OPENSSL_STRING时,const本身是限定类型OPENSSL_STRING的,因此类型是char * const,即指向非const charconst指针(请注意,它不是const char *)。Gcc只是想告诉你,作为演员的结果,const部分被忽略了。也就是说,(char * const) *ap;具有与(char *) *ap;相同的效果。

将类型更改为int可能会更清楚。

代码语言:javascript
复制
const int i = (int) 0;       // a weird conversion
const int i = (const int) 0; // same effect as above
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66388124

复制
相关文章

相似问题

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