Предупреждение компилятора о printf () long unsigned int и uint32_t - PullRequest
5 голосов
/ 10 февраля 2011

В моем коде C я fprintf набираю "%lu" и даю uint32_t для соответствующего поля.Но когда я компилирую с -Wall в GCC (версия 4.2.4), я получаю следующее предупреждение:

writeresults.c:16: warning: format '%4lu' expects type 'long unsigned int', but argument 2 has type 
`uint32_t'

Не являются ли uint32_t и long unsigned int одинаковыми на 32архитектура?Можно ли избежать этого предупреждения, не удаляя переключатель компилятора -Wall или не используя типизацию (и если да, как)?

Да, я все еще использую 32-битный компьютер / arch / OS / compiler (слишком бедный в настоящее время, чтобы позволить себе новое 64-битное HW).Спасибо!

Ответы [ 3 ]

9 голосов
/ 10 февраля 2011

uint32_t на x86 Linux с GCC просто unsigned int. Поэтому используйте fprintf(stream, "%4u", ...) (без знака int) или, что еще лучше, fprintf(stream, "%4" PRIu32, ...) (inttypes.h спецификатор printf-строки для uint32_t).

Последнее определенно устранит предупреждение / ошибку компилятора и, кроме того, является кроссплатформенным.

4 голосов
/ 10 февраля 2011

Самый простой способ надежно подавить предупреждение - использовать приведение:

printf( "%lu", ( unsigned long )x );
1 голос
/ 10 февраля 2011

"long int" и "int" - это разные типы в C ++. Возможно, вы ищете формат «u», который обозначает «unsigned int». Конечно, это зависит от того, что "uint32_t" является typedef для вашего компилятора.

...