在我们公司,我们有一个使用-Wconversion
进行编译的策略,该策略会产生一些转换警告。虽然我同意这个额外的检查可以防止错误,但是在速记操作符上看警告很烦人,例如:
uint8_t byte;
byte += 8; // conversion to 'uint8_t' from 'int' may alter its value [-Wconversion]
现在可以通过将其重写为byte = (uint8_t)(byte+8)
来解决这个问题,从而降低代码的可读性。
有没有更好的方法呢?
答案 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)
希望有所帮助。