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