Compartir vía


Advertencia del compilador (nivel 3, desactivado) C4191

'operación': conversión no segura de 'type_of_expression' a 'type_required'
Realizar una llamada de función mediante el puntero resultante puede provocar un error en el programa

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

  • Los tipos de función con diferentes convenciones de llamada.

  • Los tipos de función con diferentes convenciones de devolución.

  • Los tipos de valor devuelto o argumento con diferentes tamaños, categorías de tipo o clasificaciones.

  • Diferentes longitudes de lista de argumentos (en __cdecl, solo en la conversión de lista más larga a lista más corta, incluso si más corta es varargs).

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

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

Llamar a esta función a través del puntero de resultados, podría provocar el bloqueo del programa.

De forma predeterminada, esta advertencia está desactivada. Para obtener más información, consulte Compiler Warnings That Are Off by Default.

El ejemplo siguiente genera la advertencia 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
};