다음을 통해 공유


컴파일러 경고(수준 1) C4473

'function': 형식 문자열에 전달된 인수가 부족합니다.
자리 표시자와 해당 매개 변수는 숫자 variadic 인수를 예상하지만 숫자가 제공되었습니다.
형식 문자열 'format_string'에 누락된 variadic 인수 인덱스가 필요합니다.
이 인수는 변환 지정자에서 사용됩니다.
이 인수는 필드 너비로 사용됩니다.
이 인수는 전체 자릿수로 사용됩니다.
이 인수는 버퍼 크기로 사용됩니다.

컴파일러는 형식 문자열의 자리 표시자를 충족하는 데 필요한 인수 수와 제공된 인수 수 사이의 불일치를 감지했습니다. variadic 함수의 printf 및 scanf 제품군을 올바르게 사용하려면 형식 문자열에 지정된 만큼의 인수를 제공해야 합니다. 특정 자리 표시자에는 콘텐츠에 대한 인수뿐만 아니라 너비, 정밀도 또는 버퍼 크기를 지정하기 위해 추가 인수가 필요합니다. 일반적으로 불일치는 코드에 버그가 있음을 의미합니다.

printf 패밀리 형식 문자열 자리 표시자와 관련된 인수에 대한 자세한 내용은 Format 사양 구문인 printf 및 wprintf 함수를 참조 하세요. 함수 관련된 정보는 설명서를 참조하세요.

이 경고는 Visual Studio 2015의 새로운 경고입니다.

예시

이러한 샘플에서는 C4473 경고가 해당 인수와 형식 문자열이 일치하지 않는 결과를 초래할 수 있는 두 가지 방법을 보여 줍니다. 또한 문제를 해결하는 방법을 보여 줍니다.

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

첫 번째 오류 메시지에서 컴파일러는 인수가 누락된 것을 감지하지만 누락된 인수가 너비인지 콘텐츠인지 알 수 없으므로 제공된 인수가 너비에 대해 첫 번째 인수이고 누락된 인수는 형식 변환 지정자에 대한 두 번째 인수라고 가정합니다. 형식 문자열을 검사하여 실제 누락된 인수를 확인해야 합니다.

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

이 예제 에서 scanf_s 각 자리 표시자에 대해 두 개의 인수가 필요하며, 하나는 쓸 주소를 제공하고, 두 번째 인수는 첫 번째 개체 틀의 크기를 제공해야 합니다. 각 라이브러리 함수에 대한 설명서에서 필요한 인수에 대한 설명을 확인합니다.