【发布时间】:2021-12-11 08:34:33
【问题描述】:
如果没有 -Wconversion,编译器不会对此发出警告:
#include <inttypes.h>
#include <stdio.h>
static void foofunc (uint8_t arg) { printf ("arg: %i\n", arg); }
uint32_t biggie = 42000;
int main (void) { foofunc (biggie); return 0; }
即使使用 -Wall 和 -Wextra,编译器也会默默构建打印 16 的程序,我们都知道这是错误的 :)
但是使用 -Wconversion 你必须这样写:
#include <inttypes.h>
#include <stdio.h>
static void foofunc (uint8_t arg) { printf ("arg: %i\n", arg); }
uint8_t littlevar = 42; ;
int main (void) { foofunc ((uint8_t) (littlevar + 1)); return 0; }
我猜这是最后一次发生,因为加法运算在加法之前不知何故变成了 int。无论如何,使用 UINT8_C(1) 并不能解决它。然后有很多字符串等的演员表。
是否有一些我错过的中间方法可以捕捉 uint32_t 到 uint8_t 的完全钝化传递,同时又不需要在其他地方进行太多嘈杂的转换?
【问题讨论】:
-
如果
littlevar的值为 255 会怎样?你想不想被警告? -
@FredLarson 编译器不会警告运行时:)
-
@0___________:哦,我知道了。
-
@FredLarson 应该有警告
**Warning** Style. Properly format your code -
也许我遗漏了一些东西,但在第二个示例中,演员阵容对我来说似乎是不必要的。
foofunc(littlevar + 1)在没有警告的情况下工作得很好。例如:gcc.godbolt.org/z/5YGsM3Txn