2011-02-10 2 views
4

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

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/компилятор (слишком скудный на данный момент, чтобы предоставить новый 64-бит HW). Благодаря!

+0

Реальный вопрос: «Как я могу получить куб.см до * не * предупреждать о {% г с длинными}, на машинах, где долго = = int, потому что по какой-либо причине (вероятно, MS-совместимость) int32_t был определен как long, а не int на машине, и люди настаивают на использовании int32_t везде, и я действительно не хочу ставить (int) перед каждым одна вещь передана printf ". – greggo

ответ

9

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

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

+0

Ну, где же «плохой» кастинг, о котором вы говорите? 'PRIu32' * - это * define, который правильно обрабатывает' uint32_t'. –

+0

О, мой, ты прав! Я не прав. Благодарю. Я удалю свой комментарий. – vy32

1

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

+0

В тех случаях, когда они имеют одинаковый размер, компилятор знает об этом, и поэтому он может знать («% d», (long) x) будет работать нормально, но он предупреждает вас, потому что эта конструкция не будет работать на других машины. Если, конечно, «длинный» действительно не является int32_t typedef, и в этом случае он будет работать на любой машине с int = 32 бит. Я бы предпочел, если есть способ отменить это, и только предупредить о вещах, которые * действительно ошибочны в текущей ситуации. – greggo

4

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

 
printf("%lu", (unsigned long)x); 
+2

... и это совершенно портативно, так как минимально допустимый размер 'unsigned long' вполне достаточен для хранения всех значений типа' uint32_t'. – caf

Смежные вопросы