gpt4 book ai didi

c++ - 如何让 Clang 忽略特定 block 中的特定警告?

转载 作者:太空狗 更新时间:2023-10-29 23:06:00 26 4
gpt4 key购买 nike

我正在检查具有类型特征的数值范围,而无符号类型会生成警告。

Comparison of unsigned expression >= 0 is always true

如何在特定代码范围内禁用某些警告?我在 Clang 中使用了 GCC 样式 #pragma 但这不起作用。这是我的代码。

template<typename originT, typename destinationT>
void
assertForNumericRange(const originT value)
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits"
assertWithReason(value >= std::numeric_limits<destinationT>::min());
assertWithReason(value <= std::numeric_limits<destinationT>::max());
#pragma GCC diagnostic pop
}

注意

目前,我将断言分为三组,floating-point,unsigned int,signed int。但如果可能的话,我希望将它们整合为一个。

我正在使用 Xcode 5.0 beta。在命令行中,它报告如下:苹果 LLVM 版本

5.0 (clang-500.1.58) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.3.0
Thread model: posix

最佳答案

您使用的是哪个版本的 Clang?来自 the Clang User Manual它应该像你那样工作。但是你的范围断言不会像你希望的那样工作:

第一个断言本身没有多大意义,如果 destinationT 是无符号的,那么 min 给出 0。要么 originT 也是无符号的,那么它显然不是负数,这就是编译器警告您的内容。或者 originT 是有符号的,比较会将一个或两个操作数转换为其他类型,例如可能将 value 转换为无符号(因此为正)表示。

举个例子

 assertForNumericRange<signed char, unsigned long>( (signed char)-1);  

(signed char)-1unsigned long 之间的比较会将 -1 提升为 unsigned long,有效地给出以下断言32 位长:

assertWithReason((unsigned long)0xFFFFFFFF >= std::numeric_limits<destinationT>::min());
assertWithReason((unsigned long)0xFFFFFFFF <= std::numeric_limits<destinationT>::max());

两次比较都为真,而 -1 显然unsigned long 的值范围内。

关于c++ - 如何让 Clang 忽略特定 block 中的特定警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17205700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com