clang, gcc和忽略的限定符:谁是正确的?



在编译BoringSSL时,我发现gcc和clang之间的行为有所不同,并且能够将其简化为以下测试用例来说明:

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;
}

我测试了以下四种场景:

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$ 

这是一个bug在gcc -或有更多的东西,我不明白?


作为参考:警告在BoringSSL的堆栈。h

给定const OPENSSL_STRING,const在类型定义OPENSSL_STRING本身上是合格的,因此类型将是char * const,即const指针指向非constchar(注意它不是const char *)。Gcc只是试图告诉您,作为强制转换结果,const部分被忽略。即(char * const) *ap;(char *) *ap;具有相同的效果。

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

const int i = (int) 0;       // a weird conversion
const int i = (const int) 0; // same effect as above

相关内容

  • 没有找到相关文章

最新更新