【问题标题】:Integral promotion and operator+=积分推广和运营商+=
【发布时间】:2019-02-07 13:41:33
【问题描述】:

我需要消除 gcc -Wconversion 警告。例如

typedef unsigned short     uint16_t;

uint16_t a = 1;
uint16_t b = 2;
b += a;

给予

warning: conversion to 'uint16_t {aka short unsigned int}' from 'int' may alter its value [-Wconversion]
     b += a;
     ~~^~~~

我可以消除这个

uint16_t a = 1;
uint16_t b = 2;
b = static_cast<uint16_t>(b + a);

有没有办法保留operator+= 并消除警告?谢谢。

编辑

我用

gcc test.cpp -Wconversion

我的 gcc 版本是

gcc.exe (Rev3, 由 MSYS2 项目构建) 7.2.0

【问题讨论】:

  • 请不要同时标记 C 和 C++,只使用您正在编程的语言。对于这样的语义细节,C 和 C++ 之间通常存在差异。
  • typedef unsigned short uint16_t?为什么不#include &lt;cstdint&gt;?后者在我看来更可靠。
  • 从技术上讲,编译器的警告是正确的,即使它可能无关紧要(因为编译器不知道运行时会发生什么)。除了关闭-Wconversion,我真的看不到解决方案。
  • 为什么关不掉?它是某个“建筑师”决定必须始终使用它的更大项目的一部分吗?即使它通常会给出比“真实”警告更多的误报?
  • @bencemeszaros 您应该与更高级别的人员进行对话。此警告不适用于一般用途。

标签: c++ integer-promotion


【解决方案1】:

我需要消除 gcc -Wconversion 警告。

你没有说为什么,但这实际上不太可能。

来自the GCC wiki page on this switch

为什么 -Wall 或至少 -Wextra 不启用 Wconversion?

隐式转换在 C 语言中非常常见。这与前端没有数据流(见下一个问题)这一事实相关,导致难以避免完美工作和有效代码的警告。 Wconversion 专为程序员愿意接受和解决无效警告的小众用途(安全审计、将 32 位代码移植到 64 位等)而设计。因此,如果没有明确请求,则不应启用它。

如果你不想要它,就把它关掉。

使用不必要的强制转换来破坏您的代码,使其更难阅读和维护,这是错误的解决方案。

如果您的构建工程师坚持使用此标志,请询问他们为什么,并要求他们停止。

【讨论】:

  • 这个标志毕竟不会启用。谢谢。
  • @bencemeszaros 好消息!
【解决方案2】:

您可以构建自己的抽象来重载+= 运算符,例如

template <typename T>
class myVar {
    public:
    myVar(T var) : val{var} {}
    myVar& operator+=(const myVar& t) { 
        this->val = static_cast<T>(this->val + t.val);
        return *this; 
    }
    T val;
};

int main()
{
    typedef unsigned short     uint16_t;

    myVar<uint16_t> c{3};
    myVar<uint16_t> d{4};
    c += d;
}

它仍然使用static_cast,但你只需要使用一次,然后重复使用它。你的main 不需要它。

恕我直言,它只是增加了开销,但意见可能会有所不同......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多