代码之家  ›  专栏  ›  技术社区  ›  bencemeszaros

整体推广与运营商+=

  •  7
  • bencemeszaros  · 技术社区  · 7 年前

    我需要消除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测试.cpp-wconversion

    我的GCC版本是

    gcc.exe(第3版,由msys2项目构建)7.2.0

    2 回复  |  直到 7 年前
        1
  •  10
  •   Lightness Races in Orbit    7 年前

    我需要消除gcc-wconversion警告。

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

    the GCC wiki page on this switch :

    为什么wconversion不是靠墙或者至少靠wextra启用的?

    隐式转换在C中非常常见。这与前端没有数据流(请参阅下一个问题)这一事实联系在一起,导致很难避免警告,以使代码工作良好且有效。 Wconversion 是为特定用途(安全审计、将32位代码移植到64位等)而设计的,程序员愿意接受并解决无效警告。因此,如果没有明确请求,就不应该启用它。

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

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

    如果你的建筑工程师坚持这个标志,问他们 为什么? 让他们停下来。

        2
  •  0
  •   izlin    7 年前

    您可以构建自己的抽象来超载 += 接线员,有点像

    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 .

    嗯,它只是增加了管理费用,但意见可能会有所不同…

    推荐文章