"% d" ожидает аргумент типа "int", но аргумент 2 имеет тип "long unsigned int" [-Wformat =]
Я продолжаю получать предупреждения компиляции, но я не знаю, как это исправить:
'%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [
Программа работает нормально, но я все равно получаю предупреждения компиляции:
/* Sizeof.c--Program to tell byte size of the C variable */
#include <stdio.h>
int main(void) {
printf("\nA Char is %d bytes", sizeof( char ));
printf("\nAn int is %d bytes", sizeof( int ));
printf("\nA short is %d bytes", sizeof( short ));
printf("\nA long is %d bytes", sizeof( long ));
printf("\nA long long is %d bytes\n", sizeof( long long ));
printf("\nAn unsigned Char is %d bytes", sizeof( unsigned char ));
printf("\nAn unsigned int is %d bytes", sizeof( unsigned int));
printf("\nAn unsigned short is %d bytes", sizeof( unsigned short ));
printf("\nAn unsigned long is %d bytes", sizeof( unsigned long ));
printf("\nAn unsigned long long is %d bytes\n",
sizeof( unsigned long long ));
printf("\nfloat is %d bytes", sizeof( float ));
printf("\nA double is %d bytes\n", sizeof( double ));
printf("\nA long double is %d bytes\n", sizeof( long double ));
return 0;
}
Ответы
Ответ 1
sizeof
возвращает size_t
вам нужно использовать %zu
для строки формата вместо %d
. Тип целых чисел без знака size_t
может варьироваться (в зависимости от платформы) и может быть не длинным без знака int во всем мире, который рассматривается в стандартном разделе проекта C99 6.5.3.4
Оператор sizeof оператора 4:
Значение результата определяется реализацией, а его тип (целочисленный тип без знака) size_t, определенный в (и других заголовках).
Также обратите внимание, что использование неправильного спецификатора формата для printf
- это поведение undefined, которое описано в разделе 7.19.6.1
Функция fprintf, которая также охватывает printf
в отношении спецификаторов формата, говорит:
Если спецификация преобразования недействительна, поведение undefined. 248) Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение undefined.
Обновить
Visual Studio
не поддерживает спецификатор формата z
:
Префикс hh, j, z и t длины не поддерживается.
в этом случае правильный спецификатор формата будет %Iu
.
Ответ 2
Компилятор предупреждает вас, что вы можете потерять точность. То есть спецификатор формата, который вы используете для печати sizeof
, %d
, не может печатать весь диапазон size_t
. Измените %d
на %zu
, и ваше предупреждение исчезнет.
Ответ 3
У меня была такая же проблема в Linux. одна и та же программа работает без ошибок в окнах (означает, что "% d" работает без ошибок), но для linux мне пришлось заменить все "% d" на "% lu", чтобы запустить программу.