GCC 和 -Wconversion

2024-05-08

让我们编译以下程序:

int main()
{
    uint16_t data = 0;
    data |= uint16_t(std::round(3.14f));
    return 0;
}

with g++ -Wconversion prog.cpp

我们会得到warning: conversion to ‘uint16_t {aka short unsigned int}’ from ‘int’ may alter its value,但我在这里看不到隐式转换。

这种警告应该通过显式强制转换来消除,例如:

double d = 3.14;
float foo1 = d; // Warning
float foo2 = float(d); // No warning
float foo2 = static_cast<float>(d); // No warning

GCC 就在这里还是一个错误?

请注意,我的片段很小。例如,在以下情况下警告消失:

  • 去除f后缀来自3.14,即做到double
  • 使用赋值代替|=
  • remove std::round
  • 缓存舍入结果:const auto r = uint16_t(std::round(3.14f));,然后或将其分配给data.

GCC 就在这里还是一个错误?

由于行为与预期不符,我将其称为错误。

From https://godbolt.org/z/aSj--7 https://godbolt.org/z/aSj--7,看来在GCC眼里,data |= uint16_t(std::round(3.14f))被翻译为

(void) (data = TARGET_EXPR <D.2364, (uint16_t) round (3.1400001049041748046875e+0)>;, data | NON_LVALUE_EXPR <D.2364>;)

(TARGET_EXPR代表一个临时对象。D.2364是内部变量名。)

将 GCC 的内部语言翻译回 C++,我们将得到

data = (temp = (uint16_t) round (3.14e+0), data | temp)

由于逗号表达式的 LHS 不会影响 RHS,因此这应该和data = data | temp。然而,GCC 对前者发出警告,但不对后者发出警告,这不太可能是故意的。因此我认为这是 GCC 维护者的疏忽。

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

GCC 和 -Wconversion 的相关文章

随机推荐

  • TeamCity 命令行构建运行程序:如何使构建失败?

    我们使用 TeamCity 的命令行构建运行程序来调用 bat 文件 bat 文件通过调用 Visual Studio 2008 的 devenv exe 来构建我们的解决方案 然后执行单元测试并创建正确的文件夹结构 我们想要做的是 如果对
  • 更改数据网格列顺序或索引

    这是我无法相信我无法弄清楚的事情 请告诉我我错过了一些简单的事情 我有一个数据网格 我用 LINQ 填充它以及一个自定义类来向其中添加数据 之后 我需要按特定顺序排列数据 它似乎忽略了我 如何更改列属性 例如索引等 这是我正在使用的 LIN
  • 如何从存储在变量中的字符串调用函数?

    我需要能够调用一个函数 但函数名称存储在变量中 这可能吗 例如 function foo code here function bar code here functionName foo I need to call the functi
  • Eclipse Package Explorer 和 Eclipse Project Explorer 之间有什么区别?

    在我看来 这两种观点实际上是相同的 尤其是自伽利略以来 这是真的吗 还是我错过了其中一个或另一个的某些功能 根据Eclipse帮助 Project Explorer 提供了一个分层视图 工作台中的工件 即 根据具体情况定制 您的工作台的配置
  • ASP MVC.NET3 本地 IIS7 对象引用错误

    在开发 mvc Web 应用程序期间 我遇到了运行站点本地实例的问题 当我尝试重新加载页面时 在首次加载成功后 我看到以下错误 如果我通过 VS 虚拟服务器运行该站点 则不会出现任何问题 我的应用程序池正在集成模式下运行 并且正在运行 ne
  • 连续调用startRecordingToOutputFileURL:

    苹果文档 https web archive org web 20140814091047 http developer apple com library ios DOCUMENTATION AVFoundation Reference
  • 将值添加到 rCharts hPlot 工具提示

    我想通过 rCharts 向标准 Highcharts 工具提示添加一些额外的值 示例代码 require rCharts df lt data frame x c 1 5 y c 5 1 z c A B C D E name c K L
  • 将 AngularJS 应用程序部署到普通 Apache HTTP 服务器是一种常见的选择吗?

    我很好奇 AngularJS 应用程序通常部署到什么样的服务器上 Google 没有给出令人满意的答案 特别是 在我看来 AngularJS 应用程序只是静态文件的集合 因此在生产中将这样的应用程序部署到普通 Apache HTTP 服务器
  • 是否可以在三元表达式上只放置一个选项?

    我只是好奇这是否可能 或者是否有办法使它成为 C 的有效语法 expression value do nothing here or put some empty block like SomeClass SomeMethod Edit 为
  • MVC 删除记录但如何在控制器中对此进行编码

    我是使用 ASP Net C 的 MVC3 初学者 但我没有遇到下一种删除记录的情况 我有一个视图要求用户确认删除项目 记录 作为代码 我用它来初始化视图 public ActionResult KeywordsDelete Guid id
  • 我的 R 平方分数为负,但使用 k 倍交叉验证的准确度分数约为 92%

    对于下面的代码 我的 r 平方分数为负 但使用 k 折交叉验证的准确度分数为 92 这怎么可能 我使用随机森林回归算法来预测一些数据 数据集的链接在下面的链接中给出 https www kaggle com ludobenistant hr
  • 具有精确 k 次反转的排列数

    Let A a1 a2 an 是整数的排列1 2 n 一对索引 i j where 1 lt i lt j lt n 是排列的逆A if ai gt aj 我们给定整数n gt 0 and k gt 0 n 元素排列到底包含多少个k反转 这
  • 如何检测机器是否加入域?

    如何检测计算机是否已加入 Active Directory 域 相对于工作组模式 如果没有必要的话 不要用 pinvoke 来愚弄 参考System DirectoryServices 然后调用 System DirectoryServic
  • 使浮动div高度相同

    我有 2 个并排的 div 我预先不知道它们的高度 它根据内容而变化 有没有一种方法可以确保它们始终具有相同的高度 即使其中一个拉伸 仅使用 CSS 我做了一个小提琴来展示 我希望红色和蓝色的 div 高度相同 http jsfiddle
  • 使用 jenkins.Creating .apk 文件生成 android 版本

    我正在使用 Jenkins 在 mac 上持续集成 android 应用程序 但是我无法使用 Jenkins 生成 apk 文件 就像我们在 iOS 应用程序中创建 ipa 一样 创建用于在 mac 上分发的 apk 文件的配置是什么 您可
  • 过滤两个类别的产品集合 Magento 1.7

    我想要获取包含 A 类或 B 类产品的产品集合 我已经能够使用以下 php 代码成功获取这些产品 collection Mage getModel catalog product gt getCollection gt joinField
  • 需要有关带有正文参数的 RestTemplate Post 请求的帮助吗?

    我有一个rest api url 并通过Rest Client restclient ui 2 4 jar with dependencies 提交了与带有正文 用户名 密码 其他参数 的POST请求相同的内容 并且它工作得很好 没有任何问
  • 将 numpy 记录数组转换为字典列表的有效方法

    如何转换下面的 numpy 记录数组 recs Bill 31 260 0 Fred 15 145 0 r rec fromrecords recs names name age weight formats S30 i2 f4 到字典列表
  • 使用 Assetic PHP 通过 RVM 安装后 Sass 损坏

    我正在尝试设置 Assetic PHP 资源编译器 并且它可以与 CoffeeScript Stylus 和 Less 一起使用 所有 NPM 包都运行良好 然而 对于 Sass 我遇到了问题 以下是我到目前为止所采取的步骤 我安装了 RV
  • GCC 和 -Wconversion

    让我们编译以下程序 int main uint16 t data 0 data uint16 t std round 3 14f return 0 with g Wconversion prog cpp 我们会得到warning conve