Freigeben über


Warnung C6284

Objekt, das als Parameter übergeben wird, wenn eine Zeichenfolge im Aufruf von '*function*' erforderlich ist

Hinweise

Diese Warnung weist darauf hin, dass zwischen dem Formatbezeichner und dem Typ, der in einer printfFormatformatfunktion verwendet wird, ein Konflikt auftritt. Der Formatbezeichner ist ein C-Formatzeichenfolgentyp, %s z. B. oder %ws, und das Argument ist ein Klassen-/Struktur-/Union-Typ. Dieser Fehler kann zu Abstürze führen, zusätzlich zu potenziell falschen Ausgaben.

Dieser Fehler ist häufig auf das Vergessen zurückzuführen, einen Objektzeichenfolgentyp wie std::stringz. B. in bstr_t die C-Formatzeichenfolge zu konvertieren, CComBSTR die von der printfFunktion -style erwartet wird. Wenn ja, besteht der Fix darin, dem Typ die entsprechende Konvertierung hinzuzufügen. Die Konvertierung ist erforderlich, da die variadischen Parameter in printf-style-Funktionen untypiert sind, sodass keine automatische Konvertierung auftritt.

Codeanalysename: OBJECT_AS_STRING_ARGUMENT_TO_FORMAT_FUNCTION

Beispiel

#include <atlbase.h>
#include <string>

void f()
{
  char buff[50];
  CComBSTR bstrValue{"Hello"};
  std::string str{"World"};

  // Oops, %ws and %s require C-style strings but CComBSTR and std::strings are being passed instead
  sprintf(buff, "%ws %s", bstrValue, str);
}

Beheben Sie die Warnung, indem Sie die entsprechenden Konvertierungen hinzufügen:

#include <atlbase.h>
#include <string>

void f()
{
  char buff[50];
  CComBSTR bstrValue{"Hello"};
  std::string str{"World"};

  // Fixed by adding a static_cast to the CComBSTR and calling c_str() on the std::string
  sprintf(buff, "%ws %s", static_cast<wchar_t*>(bstrValue), str.c_str());
}

Siehe auch

static_cast-Operator
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
C4477
C4840