Udostępnij za pośrednictwem


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.