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.