Поделиться через


Предупреждение компилятора (уровень 1) C4477

"function": строка форматирования "string" требует аргумент типа "type", но номер аргумента variadic имеет тип "type"

Компилятор обнаружил несоответствие между типом аргумента, необходимым для удовлетворения заполнителя в строке формата, и типом аргумента, предоставленным. Правильное использование семейств printf и scanf функций variadic требует предоставления аргументов типов, указанных строкой формата. Несоответствие обычно означает наличие ошибки в коде.

Сведения о аргументах, связанных с заполнителями строкового формата printf, см. в разделе "Синтаксис спецификации форматирования": функции printf и wprintf. Сведения, относящиеся к функции, см. в документации.

Это предупреждение новое в Visual Studio 2015.

Пример

В этом примере показаны два предупреждения C4477 для первой функции printf_s, если два аргумента обнаружены неправильного типа, а также показывает, как устранить проблемы.

// C4477p.cpp
// compile with: cl /c /W4 C4477p.cpp
#include <stdio.h>

void print_func(int a, float f)
{
    printf_s("This takes int and double arguments %d and %f.\n", f, a); // C4477, expected int then double
    printf_s("This takes int and double arguments %d and %f.\n", a, f); // fix: types in correct order
}

В первом сообщении об ошибке компилятор обнаруживает, что double аргумент предоставляется, когда int ожидается. A float автоматически повышает уровень double в списке аргументов variadic. Второе сообщение об ошибке показывает, что компилятор ожидал double аргумент, но int был предоставлен. Компилятор не может сказать, что вы переключили порядок аргументов. Необходимо проверить строку формата, чтобы определить фактический порядок аргументов и указать правильные типы аргументов.