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