Compartir a través de


Advertencia del compilador (nivel 3) C4191

Actualización: noviembre 2007

Mensaje de error

'operador/operación' : conversión no segura de 'tipo de expresión' a 'tipo requerido'
'operator/operation' : unsafe conversion from 'type of expression' to 'type required'

Varias operaciones que comprenden punteros de función se consideran no seguras:

  • Los tipos de funciones tienen diferentes convenciones de llamada.

  • Los tipos de funciones tienen diferentes convenciones de devolución.

  • Los argumentos o tipos de valor devuelto tienen diferente tamaño, categoría de tipo o clasificación.

  • Las longitudes de la lista de argumentos son diferentes (en __cdecl, sólo en la conversión de una lista más larga a otra más corta, incluso si la más corta es varargs).

  • Existe un puntero a datos (distinto de void*) que tiene un alias respecto de un puntero a una función.

  • Cualquier otra diferencia de tipos que pueda producir un error o advertencia en una conversión reinterpret_cast.

Llamar a esta función a través del puntero de resultados puede hacer que se bloquee la aplicación.

De forma predeterminada, esta advertencia está desactivada. Para obtener más información, vea Advertencias del compilador desactivadas de forma predeterminada.

El ejemplo siguiente genera el error C4191:

// C4191.cpp
// compile with: /W3 /clr
#pragma warning(default: 4191)

void __clrcall f1() { }
void __cdecl   f2() { }

typedef void (__clrcall * fnptr1)();
typedef void (__cdecl   * fnptr2)();

int main() {
   fnptr1 fp1 = static_cast<fnptr1>(&f1);
   fnptr2 fp2 = (fnptr2) &f2;

   fnptr1 fp3 = (fnptr1) &f2;   // C4191
   fnptr2 fp4 = (fnptr2) &f1;   // C4191
};