Freigeben über


Compilerwarnung (Ebene 1) C4477

'function' : Formatzeichenfolge 'string' erfordert ein Argument vom Typ 'type', aber variadische Argumentnummerhat typ 'type'

Der Compiler hat einen Konflikt zwischen dem Typ des Arguments erkannt, der erforderlich ist, um den Platzhalter in einer Formatzeichenfolge zu erfüllen, und dem typ des angegebenen Arguments. Die korrekte Verwendung der Printf- und Scanf-Familien von variadischen Funktionen erfordert, dass Sie Argumente der typen angeben, die durch die Formatzeichenfolge angegeben sind. Ein Konflikt bedeutet im Allgemeinen, dass in Ihrem Code ein Fehler auftritt.

Informationen zu den Argumenten, die den Platzhaltern des Printf-Familienformats zugeordnet sind, finden Sie unter Formatspezifikationssyntax: printf- und wprintf-Funktionen. Informationen zu Funktionsfunktionen finden Sie in der Dokumentation.

Diese Warnung ist neu in Visual Studio 2015.

Beispiel

Dieses Beispiel zeigt zwei C4477-Warnungen für die erste printf_s-Funktion, wenn zwei Argumente vom falschen Typ gefunden werden, und zeigt außerdem, wie die Probleme behoben werden.

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

In der ersten Fehlermeldung erkennt der Compiler, dass ein double Argument angegeben wird, wenn ein int Argument erwartet wird. A float wird automatisch in die variadische Argumentliste höhergestuft double . Die zweite Fehlermeldung zeigt, dass der Compiler ein double Argument erwartet hat, aber ein int Argument angegeben wurde. Der Compiler kann nicht erkennen, dass Sie die Reihenfolge der Argumente ausgetauscht haben. Sie müssen die Formatzeichenfolge untersuchen, um die tatsächliche Argumentreihenfolge zu bestimmen und die richtigen Argumenttypen anzugeben.