gpt4 book ai didi

c - 有没有更好的方法来缓解这个警告?

转载 作者:行者123 更新时间:2023-12-01 12:07:07 25 4
gpt4 key购买 nike

我有一个结构,我在其中使用位域来优化内存。我有一个 uint64_t 类型,我想打印它的值。编译时它向我显示此警告:format '%lu' expects argument of type 'long unsigned int', but argument 5 has type 'long unsigned int:48' [-Wformat=]

我已经尝试通过在编译 -Wno-format 时键入来抑制此警告。我想知道是否有更好的方法。

这里是一些代码:

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

typedef struct gn_addr
{
unsigned int m:1;
unsigned int st:5;
unsigned int reserved:10;
uint64_t mid:48;
} gn_addr ;

void gn_addr__print(gn_addr *self)
{
printf("M=>%d\nST=>%d\nReserved=>%d\nMID=>%lu\nTotal size %ld bytes\n",
self->m, self->st, self->reserved, self->mid, sizeof(self));
}

最佳答案

虽然您绝对应该应用其他答案中的修复程序以获得可移植格式说明符,但警告仍然存在。原因是可变参数函数(如 printf)的额外参数会进行参数提升。参数提升包括整数提升。

整数提升的规则会将转换等级小于 int/unsigned 的任何整数以及位字段转换为 int /未签名。因此,对于您的初始位字段,您会自动获得 int

对于转换等级高于 int/unsigned 的整数,不会发生提升。因此,您的位域不会提升为 uint64_t,并且您会收到有关参数不匹配的警告。你需要一个 Actor 。

(uint64_t)self->mid

顺便说一句,由于没有人提到,size_t(sizeof 运算符的类型)的可移植格式说明符是 %zu。您应该使用它而不是 %ld

关于c - 有没有更好的方法来缓解这个警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55489210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com