Хотя вы обязательно должны применить исправления в других ответах, чтобы получить переносимые спецификаторы формата, предупреждение будет сохраняться. Причина в том, что дополнительные аргументы для функции с переменным числом, например printf
, подвергаются продвижению аргументов. Поощрение аргумента включает целочисленное продвижение.
Правила для целочисленных повышений преобразуют любое целое число с рангом преобразования меньше int
/ unsigned
, а также битовые поля, в int
/ unsigned
. Таким образом, для ваших начальных битовых полей вы автоматически получаете int
.
Для целых чисел с более высоким рангом конверсии, чем int
/ unsigned
, повышение не происходит. Таким образом, ваше битовое поле не переведено в uint64_t
, и вы получите предупреждение о несоответствии аргументов. Вам нужен актерский состав.
(uint64_t)self->mid
Кстати, поскольку никто не упомянул, спецификатор переносимого формата для size_t
(тип оператора sizeof
) равен %zu
. Вы должны использовать это вместо %ld
.