다음을 통해 공유


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

'function': 서식 문자열 'string'에는 'type' 형식의 인수가 필요하지만, variadic 인수 number의 '형식은 'type'입니다.

컴파일러가 형식 문자열의 자리 표시자를 충족하는 데 필요한 인수 형식과 제공된 인수 형식 간의 불일치를 발견했습니다. variadic 함수의 printf 및 scanf 패밀리를 올바르게 사용하려면 형식 문자열에 지정된 형식의 인수를 제공해야 합니다. 일반적으로 불일치는 코드에 버그가 있음을 의미합니다.

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

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

예시

이 샘플에서는 두 인수가 잘못된 형식인 것으로 확인된 첫 번째 printf_s 함수에 대한 두 개의 C4477 경고를 보여 줍니다. 또한 문제를 해결하는 방법도 보여 줍니다.

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

첫 번째 오류 메시지에서 컴파일러는 인수가 필요한 경우 int 제공된 것을 double 감지합니다. A float 는 variadic 인수 목록에서 자동으로 승격 double 됩니다. 두 번째 오류 메시지는 컴파일러가 인수를 double 예상했지만 제공된 것을 int 보여줍니다. 컴파일러는 인수의 순서를 바꿨다는 것을 알 수 없습니다. 형식 문자열을 검사하여 실제 인수 순서를 확인하고 올바른 인수 형식을 제공해야 합니다.