спецификаторы формата printf для uint32_t и size_t - PullRequest
90 голосов
/ 02 июля 2010

У меня есть следующее

size_t   i = 0;
uint32_t k = 0;

printf("i [ %lu ] k [ %u ]\n", i, k);

При компиляции я получаю следующее предупреждение:

format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’

Когда я запустил это с помощью шины, я получил следующее:

Format argument 1 to printf (%u) expects unsigned int gets size_t: k

Большое спасибо за любой совет,

Ответы [ 4 ]

125 голосов
/ 02 июля 2010

Попробуйте

#include <inttypes.h>
...

printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);

z представляет целое число длины, равное size_t, а макрос PRIu32, , определенный в заголовке C99 inttypes.h, представляет 32-разрядное целое число без знака.

23 голосов
/ 09 ноября 2011

Все, что нужно, - это то, что спецификаторы формата и типы согласуются, и вы всегда можете привести это к действию.long по крайней мере 32 бита, поэтому %lu вместе с (unsigned long)k всегда верны:

uint32_t k;
printf("%lu\n", (unsigned long)k);

size_t хитрее, поэтому %zu был добавлен в C99.Если вы не можете использовать это, то относитесь к нему как к k (long - самый большой тип в C89, size_t вряд ли будет больше).

size_t sz;
printf("%zu\n", sz);  /* C99 version */
printf("%lu\n", (unsigned long)sz);  /* common C89 version */

Если вы нене получите корректные спецификаторы формата для передаваемого вами типа, тогда printf будет эквивалентно чтению слишком большого или слишком малого объема памяти из массива.Пока вы используете явное приведение типов для сопоставления, оно переносимо.

22 голосов
/ 02 июля 2010

Звучит так, как будто вы ожидаете, что size_t будет таким же, как unsigned long (возможно, 64 бита), когда на самом деле это unsigned int (32 бита).Попробуйте использовать %zu в обоих случаях.

Хотя я не совсем уверен.

16 голосов
/ 03 июля 2010

Если вы не хотите использовать макросы PRI *, другой подход для печати ЛЮБОГО целочисленного типа - привести к intmax_t или uintmax_t и использовать "%jd" или %ju,соответственно.Это особенно полезно для типов POSIX (или других ОС), для которых не определены макросы PRI *, например off_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...