使用复合赋值运算符解决转换警告

时间:2014-11-14 07:07:18

标签: c++ c gcc compiler-warnings implicit-conversion

在我们公司,我们有一个使用-Wconversion进行编译的策略,该策略会产生一些转换警告。虽然我同意这个额外的检查可以防止错误,但是在速记操作符上看警告很烦人,例如:

uint8_t byte;
byte += 8; // conversion to 'uint8_t' from 'int' may alter its value [-Wconversion]

现在可以通过将其重写为byte = (uint8_t)(byte+8)来解决这个问题,从而降低代码的可读性。

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

考虑您收到警告的原因,即整数常量8的类型为int。 C中的所有内容都必须提升为(签名)int,这是该语言的一个众所周知的设计缺陷。

假设您有byte += 256;byte += -1;byte += function_that_returns_int();。所有这些都是潜在的严重错误,因此启用警告肯定是有意义的。

除了将操作结果强制转换为预期类型uint8_t之外,没有其他工作方法。这并不一定是坏事,因为它创建了自我记录的代码,并且说实话,我实际上已经考虑了在这个计算中使用的类型,所以不应该有溢出"。

答案 1 :(得分:-1)

这可能无法完全解决您的问题,但至少会提示您几乎所有内容都有解决方案。

#include <stdio.h>
#include <stdint.h>

#define SAFE_ADD(a,b) ((a) = (typeof(a))((a)+(b)))

int main(void)
{
        uint8_t byte = 0;
        SAFE_ADD(byte, 8);

        fprintf(stderr, "byte = %d \n", byte);
        return 0;
}

使用gcc 4.8.4编译无警告(gcc -Wall -Wconversion byte.c)
希望有所帮助。