"%d "ожидает аргумент типа "int" , но аргумент 2 имеет тип "long unsigned int" [- Wformat=] [duplicate]

этот вопрос уже есть ответ здесь:

Я продолжаю получать предупреждения компиляции, но я не знаю, как это исправить:

'%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 bytesn", 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 bytesn",
            sizeof( unsigned long long ));
    printf("nfloat is %d bytes", sizeof( float ));
    printf("nA double is %d bytesn", sizeof( double ));
    printf("nA long double is %d bytesn", sizeof( long double ));

    return 0;

}

3 ответов


sizeof возвращает size_t вам нужно использовать %zu для строки формата вместо %d. Тип целое число без знака of size_t может варьироваться (в зависимости от платформы) и не может быть длинный неподписанный int везде, который охвачен в проекте раздела стандарта C99 6.5.3.4 оператор sizeof абзац 4:

значение результата определяется реализацией, а его тип (без знака целочисленный тип) is size_t, определенный В (и других заголовках).

также обратите внимание, что использование неправильного спецификатора формата для printf неопределенное поведение, которое рассматривается в разделе 7.19.6.1 функция fprintf, и printf относительно спецификаторов формата говорит:

если спецификация преобразования является недопустимым, поведение неопределено.248) если какой-либо аргумент не правильный тип соответствующая спецификация преобразования, поведение не определено.

обновление

Visual Studio не поддерживает z формата:

префиксы длины hh, j, z и t не поддерживаются.

правильный спецификатор формата в этом случае будет %Iu.


компилятор предупреждает Вас, что вы можете понести потери точности. То есть, спецификатор формата, который вы используете для печати sizeof, %d, не способен печатать полный диапазон size_t. Изменить %d to %zu и Ваше предупреждение исчезнет.


У меня была такая же проблема в Linux. та же программа работает без ошибок в windows (означает, что "%d "работал без ошибок), но для linux мне пришлось заменить все "%d " на "%lu " для запуска программы.