Partilhar via


Aviso do compilador (nível 1) C4477

'function': a cadeia de caracteres de formato 'string' exige um argumento do tipo 'type', mas o argumento variádico number tem o tipo 'type'

O compilador detectou uma incompatibilidade entre o tipo de argumento necessário para satisfazer o espaço reservado em uma 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 exige que você forneça argumentos dos tipos especificados pela cadeia de caracteres de formato. Uma incompatibilidade geralmente significa que há um bug em seu código.

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

Esse aviso é novo no Visual Studio 2015.

Exemplo

Este exemplo mostra dois avisos C4477 para a primeira função printf_s, quando é descoberto que dois argumentos são 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 detecta que um argumento double é fornecido quando um int é esperado. Um float é promovido automaticamente a double na lista de argumentos variádicos. A segunda mensagem de erro mostra que o compilador esperava um argumento double, mas um int foi fornecido. O compilador não consegue detectar que você trocou a ordem dos argumentos. Você precisa examinar a cadeia de caracteres de formato para determinar a ordem real dos argumentos e fornecer os tipos de argumento corretos.