Share via


Upozornění kompilátoru (úroveň 1) C4477

'function' : formátovací řetězec 'string' vyžaduje argument typu 'type', ale číslo argumentu variadic má typ 'type'.

Kompilátor zjistil neshodu mezi typem argumentu požadovaným pro splnění zástupného symbolu v řetězci formátu a typem zadaného argumentu. Správné použití řad printf a scanf funkcí variadic vyžaduje, abyste zadali argumenty typů určených formátovacím řetězcem. Neshoda obecně znamená, že kód obsahuje chybu.

Informace o argumentech přidružených k zástupným symbolům řetězce formátu řady printf naleznete v tématu Syntaxe specifikace formátu: funkce printf a wprintf. Informace specifické pro funkci funkce najdete v dokumentaci.

Toto upozornění je nové v sadě Visual Studio 2015.

Příklad

Tato ukázka ukazuje dvě upozornění C4477 pro první funkci printf_s, když jsou nalezeny dva argumenty nesprávného typu, a také ukazuje, jak tyto problémy opravit.

// 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
}

V první chybové zprávě kompilátor zjistí, že double argument je zadán, když je očekáváno int . A float se automaticky upřednostní v double seznamu variadických argumentů. Druhá chybová zpráva ukazuje, že kompilátor očekával double argument, ale int byl zadán. Kompilátor nemůže zjistit, že jste prohodili pořadí argumentů. Chcete-li zjistit skutečné pořadí argumentů a zadat správné typy argumentů, je nutné prozkoumat formátovací řetězec.