C6284
警告 C6284: オブジェクトがパラメーター '%d' として渡されました。<関数> への呼び出しには文字列が必要です
この警告は、たとえば printf または scanf に %s が指定されている場合など、書式指定文字列で文字列が指定されているのに、代わりに C++ オブジェクトが渡されたことを示します。
この問題により、不適切な出力が生成されたり、クラッシュしたりする場合があります。
多くの場合、たとえば std::string、CComBSTR、bstr_t などの文字列型を実装する C++ オブジェクトを C の printf 形式の呼び出しに渡したときに、このメッセージが報告されます。C++ クラスの実装に応じて、つまり適切なキャスト演算子が定義されていれば、ほとんどの場合で C 文字列が必要なときに C++ 文字列オブジェクトを透過的に使用できます。しかし、printf 形式の関数は基本的に型指定されないため、文字列に対する変換は行われません。
オブジェクトによっては、 char * や TCHAR* などの適切な文字列型に static_cast 演算子を挿入するか、文字列を返す c_str() などのメンバー関数を std::string のインスタンスで呼び出す方が適切な場合があります。
使用例
次に示すコードでは、CComBSTR が sprintf 関数に渡されるため、この警告が生成されます。
#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));
}