次の方法で共有


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));
}

参照

参照

static_cast Operator

sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l