Share via


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

Vea también

Referencia

operador static_cast

sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l