如何解决clang、gcc 和忽略的限定符:谁是对的?
我在编译 BoringSSL 时发现了 gcc 和 clang 之间的行为差异,并且能够将其缩减为以下测试用例来说明:
f <- function(fname) {
ptinr <- read.csv(fname)
ptinr$project <- gsub("_19T228z1xx","",ptinr$project)
ptinr$Subject <- as.integer(gsub("CTMS-",ptinr$Subject))
ptinr$Subject <- sprintf("%03d",ptinr$Subject)
ptinr$Subject <- paste0(ptinr$project,"-",ptinr$Subject)
ptinr
}
我测试了以下四种场景:
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;
}
这是 gcc 中的一个错误 -- 还是还有其他我不明白的事情?
供参考:警告是in BoringSSL's stack.h
解决方法
给定 const OPENSSL_STRING
,const
在 typedef OPENSSL_STRING
本身上被限定,所以类型将是 char * const
,即 const
指向非常量 { {1}}(注意不是 char
)。 Gcc 只是想告诉您,作为转换结果,const char *
部分被忽略。即 const
与 (char * const) *ap;
具有相同的效果。
将类型更改为 (char *) *ap;
可能会更清晰。
int
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。