Share via


Advertencia del compilador (nivel 1) C4477

"function": la cadena de función "string" requiere un argumento del tipo "type", pero el argumento variádico number tiene el tipo "type"

El compilador detectó una discrepancia entre el tipo de argumento necesario para satisfacer el marcador de posición en una cadena de formato y el tipo de argumento que se proporcionó. El uso correcto de las familias printf y scanf de funciones variádicas requiere que proporcione argumentos de los tipos especificados por la cadena de formato. Por lo general, cualquier falta de concordancia significa que hay un error en el código.

Para información sobre los argumentos asociados a los marcadores de posición de cadena de formato de la familia printf, consulte Sintaxis de especificación de formato: funciones printf y wprintf. Consulte la documentación para obtener información específica de la función function.

Esta advertencia es nueva en Visual Studio 2015.

Ejemplo

En este ejemplo, se muestran dos advertencias C4477 para la primera función printf_s, cuando se detecta que dos argumentos son del tipo incorrecto, y también se muestra cómo corregir los problemas.

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

En el primer mensaje de error, el compilador detecta que se proporciona un argumento double cuando se espera int. Un argumento float se promueve automáticamente a double en la lista de argumentos variádicos. En el segundo mensaje de error, se muestra que el compilador esperaba un argumento double, pero se proporcionó un argumento int. El compilador no puede distinguir que se intercambió el orden de los argumentos. Debe examinar la cadena de formato para determinar el orden real de los argumentos y proporcionar los tipos de argumento correctos.