整体促销和运营商+ =

时间:2019-02-07 13:41:34

标签: c++ integer-promotion

我需要消除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

2 个答案:

答案 0 :(得分:10)

  

我需要消除gcc -Wconversion警告。

您没有说为什么,但这实际上是不可能的。

来自the GCC wiki page on this switch

  

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

     

隐式转换在C语言中非常常见。这与前端中没有数据流(请参阅下一个问题)的事实有关,导致难以避免出现警告,要求它们正常工作和有效。 Wconversion设计用于特定用途(安全审核,将32位代码移植到64位等),程序员愿意接受并解决无效警告。因此,如果未明确请求,则不应启用它。

如果您不想要它,只需将其关闭。

错误的解决方案是将代码与不必要的强制转换混合在一起,使之难以阅读和维护。

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

答案 1 :(得分:0)

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

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中不需要它。

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