我需要消除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
答案 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
中不需要它。
恕我直言,它只是增加了开销,但意见可能会有所不同...