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


Предупреждение компилятора (уровень 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 требуется два аргумента для каждого заполнителя, один для указания адреса для записи, а в секунду — для предоставления размера первого. Проверьте документацию для каждой функции библиотеки, чтобы объяснить необходимые аргументы.