如何消除特定的“无符号与零的无意义比较”警告?

2023-11-21

假设我有一个如下所示的函数:

#define LOWER_BOUND 0
#define UPPER_BOUND 42

int is_value_in_range( some_typedef val)
{
    return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
}

假设我正确配置了警告,如果some_typedef结果是一个无符号类型我会收到一条警告,指出无符号类型与 0 进行毫无意义的比较。当然这是真的,而且是有道理的。

然而,可以说我do由于一个或多个可能的原因,希望在代码中对零进行检查,例如:

  • 虽然界限始终是编译时常量,但它们可能会发生变化(并且宏可能不会“实时”靠近函数)。例如,可以通过将选项传递给编译器来设置边界。
  • 我可能想防止稍后将 typedef 更改为有符号类型,因为在更改时,可能不会仔细检查 typedef 的每次使用。

有没有一种体面的、合理便携的方法来消除这里的警告而不完全关闭它?

如果合理的话,依赖于“STATIC_ASSERT()”之类的功能(我可以使用)的东西是可以接受的。如果类型发生变化以迫使某人查看代码,我可以中断编译。但值得注意的是typeof不是我在所有目标编译器中都可用的东西。

我专门寻找 C 语言解决方案,所以模板在这里没有任何用处......


如果some_typedef不知道是未签名还是已签名,我认为你运气不好。

如果你事先知道some_typedef未签名,你可以使用

#if LOWER_BOUND > 0
    return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
#else
    return ((val <= UPPER_BOUND));
#endif

或者在这种情况下,您可以使用我的首选版本:

    return (val-LOWER_BOUND <= UPPER_BOUND-LOWER_BOUND);

Edit:我假设如果some_typedef不知道是否具有特定的符号,那么UPPER_BOUND and LOWER_BOUND两者都必须是积极的。否则你会得到非常古怪的结果some_typedef晋升为未签名。因此,您始终可以安全地使用:

    return ((uintmax_t)val-LOWER_BOUND <= UPPER_BOUND-LOWER_BOUND);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何消除特定的“无符号与零的无意义比较”警告? 的相关文章

随机推荐

  • 我可以得到Python中“print”语句的输出吗?

    pythonw exe 没有控制台 所以我看不到 print 的输出 但我的程序在 python exe 中正常 在 pythonw exe 中失败 我只想查看 python 解释器的日志和我的 print 语句打印的日志 这可行吗 您可以
  • 如何将 Nginx IP 附加到 Kubernetes Nginx Ingress Controller 中的 X-Forwarded-For

    我想知道 如何将 Nginx IP 附加到 X Forwarded For 我在 Ingress 注释中添加了片段 apiVersion networking k8s io v1beta1 kind Ingress metadata nam
  • 适用于字节数组的哈希码方法?

    数组的最佳哈希方法是什么byte 这些数组是序列化的类对象 包含通过 TCP IP 在应用程序之间传递的 jpeg 图像 数组大小约为200k 任何内置的散列函数都可以 根据您对碰撞的关心程度 您可以选择以下选项 从最多碰撞到最少碰撞 MD
  • 托管在不同域上的 JavaScript 可以读取/修改另一个域的 DOM 吗?

    我有一个关于托管在域 例如 CDN 的域 例如 example com 上但从不同域 例如 example net 下的网站加载的 JavaScript 的潜在安全问题 限制的问题 现在想象一下 加载的 JavaScript 将仅读取 修改
  • 存储过程给出与 tsql 不同的结果集,仅在某些服务器上

    这是我昨天提出的问题的后续 您是否曾经遇到过 SQL Server 2008 返回与 SQL Server 2000 不同的结果集的情况 我最初认为存储过程在 sql2000 和 sql2008 上给出了不同的结果 但我已经做了相当多的缩小
  • CLLocation距离转换

    我在 CLLocationDistance 类型的变量中有距离 我需要将其转换为整数变量 我该怎么做 我有用 CLLocationDistance kilometers int distance kilometers intValue 但它
  • 自动终止 AWS EC2 实例?

    有没有办法让 Amazon Web Services EC2 实例自行终止 亚马逊是否有任何东西允许实例在运行超过一个小时后自行终止 Hara Kiri 我可以更改正在运行的实例上的脚本来自行执行此操作 但这可能会失败 而且我不想编辑图像
  • GridView 分页 - 第一个、最后一个、下一个、上一个

    是否可以添加 GridView 分页的 第一个 最后一个 下一个 上一个 选项 我似乎无法弄清楚 我能得到的只是数字 gt gt 代表最后一个 设置 PagerSettings 部分的 PageText 属性的值
  • 不可分配给编辑器中“Expected>”类型的参数

    我的测试是从命令行通过的 但是我编辑了typescript来源使用Atom 当我在编辑器中打开其中一个测试文件时 我在这一行看到一个错误 expect pageObject name getText toEqual Some name 这是
  • Sigar 不满意链接错误

    我是西格尔的新手 我想运行一个简单的测试来了解如何监控我的系统 I added sigar 1 6 4 and log4j作为外部库 但是当我运行它时 我遇到以下错误 Exception in thread main java lang U
  • 可停靠的Windows。浮动窗口和主窗口菜单集成

    在 Visual Studio 2010 中 可停靠 Windows 似乎在任何情况下都能按预期工作 如果 浮动 文档处于活动状态并且选择了某些菜单 例如 编辑 gt 粘贴 则 浮动 文档仍然具有焦点 并且将针对该 浮动 窗口执行该命令 另
  • 我如何循环遍历 OracleDataReader 的所有列

    我有以下代码 我想循环遍历此查询结果中的所有字段并填充名为 field 的字典 给定一个数据读取器 这可能吗 OracleCommand command connection CreateCommand string sql Select
  • 如何将 Nifti 文件转换为 Numpy 数组?

    我的 Nifti 文件 ii gz 中有 3D 数组 我想将其保存为 3D numpy 数组 我使用 Nibabel 将 Numpy 转换为 Nifti1 我可以反其道而行之吗 From nipy import numpy as np im
  • 为什么 StyleCop 建议在方法或属性调用前加上“this”前缀?

    我一直在尝试遵循 StyleCop 的项目指南 看看最终生成的代码是否更好 大多数规则都是合理的 或者是关于编码标准的意见问题 但有一条规则令我困惑 因为我没有看到其他人推荐它 而且因为我没有看到它有明显的好处 SA1101 对 方法或属性
  • 尽管文件 URL 加载,AngularJS 指令 templateUrl 返回 400

    我在 MVC 5 布局页面中有一个基本指令 其中包含一个搜索指令 我的问题是 templateUrl 无法加载 400 错误 如果我直接在浏览器中输入 URL 我可以毫无困难或错误地加载 html 页面 我无法找出加载页面的 AJAX 调用
  • 增加 n_jobs 对 GridSearchCV 没有影响

    我设置了简单的实验来检查运行 sklearn 时多核 CPU 的重要性GridSearchCV with KNeighborsClassifier 我得到的结果让我感到惊讶 我想知道我是否误解了多核的好处 或者也许我没有做得正确 2 8 个
  • 以编程方式将 Android 应用程序与联系人/电话簿链接

    我目前正在编写一个应用程序 它允许扩展标准 Android 联系人 电话簿 用户可以添加与特定联系人相关的一些信息 内容 我希望标准电话簿在每个联系人上显示指向我的应用程序的链接 这些联系人在我的应用程序中包含其他数据 例如WhatsApp
  • keywords.js 未覆盖整个页面

    我正在尝试使用粒子 js作为背景 但我无法将画布设置为全尺寸背景 我针对类似问题尝试了至少 10 种不同的解决方案 但没有任何效果 画布始终作为具有与屏幕一样宽高比的元素 但在调整大小时不会将其作为一个整体覆盖 在成瘾中 它不会设置为背景
  • Kinect SDK用于手指检测?

    我是新加坡南洋理工大学 NTU 的学生 目前正在开发一个使用Kinect SDK的项目 我的问题是 任何人都知道如何使用 Kinect SDK 开发一个程序来检测手指 或指尖 甚至可能知道一些可能的参考代码 不管怎样 我也尝试在google
  • 如何消除特定的“无符号与零的无意义比较”警告?

    假设我有一个如下所示的函数 define LOWER BOUND 0 define UPPER BOUND 42 int is value in range some typedef val return LOWER BOUND lt va