Предупреждение компилятора (уровень 1) C4473
Function: недостаточно аргументов, переданных для строки форматирования
заполнители и их параметры ожидают аргументы числа вариативных аргументов, но было указано число .
Отсутствующий индекс аргумента variadic требуется строкой формата "format_string".
этот аргумент используется описателями преобразования
этот аргумент используется в качестве ширины поля
этот аргумент используется в качестве точности
этот аргумент используется в качестве размера буфера
Компилятор обнаружил несоответствие между числом аргументов, необходимым для удовлетворения заполнителей в строке формата, и число предоставленных аргументов. Правильное использование семейств printf и scanf функций variadic требует, чтобы указать столько аргументов, сколько указано строкой форматирования. Для некоторых заполнителей требуются дополнительные аргументы, чтобы указать ширину, точность или размер буфера, а также аргумент для содержимого. Несоответствие обычно означает наличие ошибки в коде.
Сведения о аргументах, связанных с заполнителями строкового формата printf, см. в разделе "Синтаксис спецификации форматирования": функции printf и wprintf. Сведения, относящиеся к функции, см. в документации.
Это предупреждение новое в Visual Studio 2015.
Пример
В этих примерах показаны два способа предупреждения C4473 из-за несоответствия строки формата с его аргументами, а также показано, как устранить проблемы.
// c4473p.cpp
// compile with: cl /c /W4 c4473p.cpp
#include <stdio.h>
void print_func(int a, float f)
{
printf_s("This takes %*f arguments.\n", f); // C4473, missing * width argument
printf_s("This takes %*f arguments.\n", a, f); // fix: supply width argument
}
В первом сообщении об ошибке компилятор обнаруживает отсутствие аргумента, но не может определить, является ли отсутствующий аргумент шириной или содержимым, поэтому предполагается, что указанный аргумент является первым, для ширины, а отсутствующий аргумент является вторым, для описателя преобразования типов. Чтобы определить фактический отсутствующий аргумент, необходимо проверить строку формата.
// c4473s.cpp
// compile with: cl /c /W4 c4473s.cpp
#include <stdio.h>
void scan_func(int a, float f)
{
char name[20];
scanf_s("%s", &name); // C4473, missing buffer size argument
scanf_s("%s", &name, sizeof(name)); // fix: supply buffer size argument
}
В этом примере scanf_s требуется два аргумента для каждого заполнителя, один для указания адреса для записи, а в секунду — для предоставления размера первого. Проверьте документацию для каждой функции библиотеки, чтобы объяснить необходимые аргументы.