Ostrzeżenie kompilatora (poziom 1) C4477
"function": ciąg formatu "string" wymaga argumentu typu "type", ale liczba argumentów wariadycznych ma typ "type"
Kompilator wykrył niezgodność między typem argumentu wymaganym do spełnienia symbolu zastępczego w ciągu formatu i typem podanego argumentu. Poprawne użycie rodzin printf i scanf funkcji wariadycznych wymaga podania argumentów typów określonych przez ciąg formatu. Niezgodność zazwyczaj oznacza, że w kodzie występuje usterka.
Aby uzyskać informacje na temat argumentów skojarzonych z symbolami zastępczymi ciągu formatu rodziny printf, zobacz Składnia specyfikacji formatu: printf i funkcje wprintf. Zapoznaj się z dokumentacją, aby uzyskać informacje specyficzne dla funkcji.
To ostrzeżenie jest nowe w programie Visual Studio 2015.
Przykład
W tym przykładzie przedstawiono dwa ostrzeżenia C4477 dla pierwszej funkcji printf_s, gdy dwa argumenty znajdują się w niewłaściwym typie, a także pokazuje, jak rozwiązać problemy.
// 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
}
W pierwszym komunikacie o błędzie kompilator wykrywa, że double
argument jest dostarczany, gdy jest oczekiwany int
. Element A float
jest automatycznie promowany do double
na liście argumentów wariadycznych. Drugi komunikat o błędzie pokazuje, że kompilator spodziewał się argumentu double
, ale int
został podany. Kompilator nie może stwierdzić, że zamieniono kolejność argumentów. Należy zbadać ciąg formatu, aby określić rzeczywistą kolejność argumentów i podać poprawne typy argumentów.