1

在编译 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$ 

这是 gcc 中的错误 - 还是有更多我不明白的事情发生?


供参考:警告位于 BoringSSL 的 stack.h

4

1 回答 1

5

Given const OPENSSL_STRING,const在 typedef 本身上是合格的OPENSSL_STRING,所以类型是char * const,即const指向非 constchar的指针(注意它不是const char *)。Gcc 只是想告诉您,作为演员表的结果,该const部分被忽略了。ie与 .(char * const) *ap;具有相同的效果(char *) *ap;

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

const int i = (int) 0;       // a weird conversion
const int i = (const int) 0; // same effect as above
于 2021-02-26T15:08:07.483 回答