C6284
Advertencia C6284: Objeto pasado como parámetro '% d' cuando la cadena es necesaria para llamar a <función>
Esta advertencia indica que la cadena de formato especifica una cadena, por ejemplo una especificación %s para printf o scanf, pero en lugar de ella se ha pasado un objeto de C++.
Este defecto podría generar resultados incorrectos o bloqueos.
Este mensaje se muestra muchas veces porque se pasa un objeto de C++ que implementa algún tipo de cadena, por ejemplo, std::string, CComBSTR o bstr_t, en una llamada de C del tipo de printf.Según la implementación de la clase de C++, es decir, si se han definido los operadores de conversión correctos, con frecuencia se pueden utilizar objetos de cadena de C++ de manera transparente cuando se necesitan cadenas de C; sin embargo, si los parámetros de funciones del tipo de printf son, en esencia, carentes de tipo, no se convierten a una cadena.
Según el objeto, puede ser apropiado insertar un operador static_cast para convertir al tipo de cadena apropiado, por ejemplo, char * o TCHAR*, o bien llamar a una función miembro que devuelva una cadena, por ejemplo, c_str(), en las instancias de std::string.
Ejemplo
El código siguiente genera esta advertencia porque CComBSTR se pasa a la función sprintf:
#include <atlbase.h>
#include <stdlib.h>
void f()
{
char buff[50];
CComBSTR bstrValue("Bye");
sprintf(buff,"%ws",bstrValue);
}
El código siguiente utiliza la conversión de tipos estática para corregir esta advertencia:
#include <atlbase.h>
#include <stdlib.h>
void f()
{
char buff[50];
CComBSTR bstrValue("Bye");
sprintf_s(buff,50,"%ws",static_cast<wchar_t *>(bstrValue));
}