C6284
경고 C6284: 개체가 매개 변수 '%d'(으)로 전달되었습니다. <function>에 대한 호출에는 문자열이 필요합니다.
이 경고는 예를 들어 printf 또는 scanf에 대한 %s 사양처럼 형식 문자열이 문자열을 지정하지만 C++ 개체가 대신 전달되었음을 나타냅니다.
이 오류로 인해 잘못된 출력이나 충돌이 발생할 수 있습니다.
이 메시지는 std::string, CComBSTR 또는 bstr_t와 같은 일부 문자열 형식을 구현하는 C++ 개체를 C의 printf 스타일 호출에 전달하기 때문에 종종 보고됩니다.C++ 클래스의 구현에 적절한 캐스트 연산자가 정의된 경우에는 C 문자열이 필요할 때마다 C++ 문자열 개체를 투명하게 사용할 수 있는 경우가 많습니다. 하지만 printf 스타일 함수의 매개 변수는 기본적으로 형식화되어 있지 않기 때문에 문자열로 변환되지 않습니다.
개체에 따라 char * 또는 TCHAR*와 같은 적절한 문자열 형식에 static_cast 연산자를 삽입하거나 std::string의 인스턴스에 대해 c_str()와 같은 문자열을 반환하는 멤버 함수를 호출해도 됩니다.
예제
다음 코드에서는 sprintf 함수에 CComBSTR가 전달되기 때문에 이 경고가 생성됩니다.
#include <atlbase.h>
#include <stdlib.h>
void f()
{
char buff[50];
CComBSTR bstrValue("Bye");
sprintf(buff,"%ws",bstrValue);
}
다음 코드에서는 정적 캐스팅을 사용하여 이 경고를 해결합니다.
#include <atlbase.h>
#include <stdlib.h>
void f()
{
char buff[50];
CComBSTR bstrValue("Bye");
sprintf_s(buff,50,"%ws",static_cast<wchar_t *>(bstrValue));
}