Compartilhar via


Aviso do compilador (nível 1) C4473

'function': não há argumentos suficientes transmitidos para a cadeia de caracteres de formato
espaços reservados e seus parâmetros esperam number argumentos variadic, mas foram fornecidos number
o argumento variadic ausente index é exigido pela cadeia de caracteres de formato 'format_string'
esse argumento é usado por um especificador de conversão
esse argumento é usado como uma largura de campo
esse argumento é usado como uma precisão
esse argumento é usado como um tamanho do buffer

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 número de argumentos fornecido. O uso correto das famílias printf e scanf de funções variádicas exige que você forneça tantos argumentos quanto especificado pela cadeia de caracteres de formato. Determinados espaços reservados exigem argumentos adicionais para especificar a largura, a precisão ou o tamanho do buffer, bem como um argumento para o conteúdo. 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

Esses exemplos mostram duas maneiras em que o aviso C4473 resulta de uma incompatibilidade de cadeia de caracteres de formato com seus argumentos, e também mostram como corrigir os problemas.

// c4473p.cpp
// compile with: cl /c /W4 c4473p.cpp
#include <stdio.h>

void print_func(int a, float f)
{
    printf_s("This takes %*f arguments.\n", f); // C4473, missing * width argument
    printf_s("This takes %*f arguments.\n", a, f); // fix: supply width argument
}

Na primeira mensagem de erro, o compilador detecta que um argumento está ausente, mas não pode dizer se o argumento ausente é a largura ou o conteúdo; portanto, ele supõe que o argumento fornecido seja o primeiro, para a largura, e que o argumento ausente seja o segundo, para o especificador de conversão de tipo. Você deve examinar a cadeia de caracteres de formato para determinar o argumento que, de fato, está ausente.

// c4473s.cpp
// compile with: cl /c /W4 c4473s.cpp
#include <stdio.h>

void scan_func(int a, float f)
{
    char name[20];

    scanf_s("%s", &name);                // C4473, missing buffer size argument
    scanf_s("%s", &name, sizeof(name));  // fix: supply buffer size argument
}

Neste exemplo, scanf_s requer dois argumentos para cada espaço reservado, um para fornecer o endereço para gravar e um segundo para fornecer o tamanho do primeiro. Verifique a documentação de cada função de biblioteca para obter uma explicação dos argumentos necessários.