Condividi tramite


C6284

Aggiornamento: novembre 2007

C6284

avviso C6284: oggetto passato come parametro '%d' mentre nella chiamata a <funzione> è richiesta una stringa.

L'avviso indica che nella stringa di formato è specificata una stringa, ad esempio una specifica %s per printf o scanf, ma è stato passato un oggetto C++.

L'errore potrebbe causare un output non corretto o arresti anomali del sistema.

Il messaggio viene spesso riportato a seguito del passaggio di un oggetto C++ che implementa qualche tipo di stringa, ad esempio std::string, CComBSTR o bstr_t, in una chiamata di tipo printf nel linguaggio C. In base all'implementazione della classe C++, ovvero se sono stati definiti gli operatori di cast corretti, è spesso possibile utilizzare in maniera trasparente gli oggetti stringa C++ laddove sono richieste stringhe in C. Tuttavia, dal momento che i parametri alle funzioni di tipo printf sono essenzialmente non tipizzati, non si verifica alcuna conversione in stringa.

A seconda dell'oggetto, può essere appropriato inserire un operatore static_cast nel tipo di stringa appropriato, ad esempio char * o TCHAR*, oppure chiamare una funzione membro che restituisca una stringa, ad esempio c_str(), su istanze di std::string.

Esempio

Il codice seguente genera questo avviso in quanto alla funzione sprintf viene passato un CComBSTR:

#include <atlbase.h>
#include <stdlib.h>

void f()
{
  char buff[50];
  CComBSTR bstrValue("Bye");
 
  sprintf(buff,"%ws",bstrValue); 
}

Per risolvere il problema, nel codice seguente viene utilizzato un cast statico:

#include <atlbase.h>
#include <stdlib.h>

void f()
{
  char buff[50];
  CComBSTR bstrValue("Bye");
  
  sprintf_s(buff,50,"%ws",static_cast<wchar_t *>(bstrValue));
}

Vedere anche

Riferimenti

static_cast Operator

sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l