Partilhar via


Aviso do compilador (nível 1) C4477

'function' : a string de formato 'string' requer um argumento do tipo 'type', mas o argumento variádico number possui tipo 'type'

Observações

O compilador detetou uma incompatibilidade entre o tipo de argumento necessário para satisfazer o espaço reservado numa cadeia de caracteres de formato e o tipo de argumento fornecido. O uso correto das famílias printf e scanf de funções variádicas requer que você forneça argumentos dos tipos especificados pela cadeia de caracteres de formato. Uma incompatibilidade geralmente significa que há um bug no seu código.

Para obter informações sobre os argumentos associados aos espaços reservados de cadeia de caracteres de formato da família printf, consulte Sintaxe de especificação de formato: funções printf e wprintf. Consulte a documentação para obter informações específicas sobre a função funcional.

Este aviso é novo no Visual Studio 2015.

Example

Este exemplo mostra dois avisos C4477 para a primeira função printf_s, quando dois argumentos são encontrados para ser do tipo errado, e também mostra como corrigir os 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
}

Na primeira mensagem de erro, o compilador deteta que um double argumento é fornecido quando um int é esperado. A float é automaticamente promovido para double na lista de argumentos variádicos. A segunda mensagem de erro mostra que o compilador esperava um double argumento, mas um int foi fornecido. O compilador não pode dizer que você trocou a ordem dos argumentos. Você deve examinar a cadeia de caracteres de formato para determinar a ordem real dos argumentos e fornecer os tipos de argumento corretos.