Compilerwarnung (Ebene 3, deaktiviert) C4191
„Vorgang“: unsichere Konvertierung von „Typ des Ausdrucks“ in „erforderlicher Typ“
Ein Funktionsaufruf mithilfe des resultierenden Zeigers kann zu einem Programmfehler führen.
Verschiedene Operationen, die Funktionszeiger verwenden, werden als unsicher angesehen:
Funktionstypen mit unterschiedlichen Aufrufkonventionen.
Funktionstypen mit unterschiedlichen Rückgabekonventionen.
Argument- oder Rückgabetypen mit verschiedenen Größen, Typkategorien oder Klassifikationen.
Verschiedene Länge von Argumentlisten (in
__cdecl
nur bei der Typumwandlung von längerer zu kürzer Liste, auch wenn die kürzere 'varargs' aufweist).Zeiger auf Daten (außer
void*
) als Alias für einen Zeiger auf eine Funktion.Alle anderen Typunterschiede, die einen Fehler oder eine Warnung bei einem
reinterpret_cast
hervorrufen würden.
Das Aufrufen dieser Funktion über den Ergebniszeiger kann zum Absturz des Programms führen.
Diese Warnung ist standardmäßig deaktiviert. Weitere Informationen finden Sie unter Compiler Warnings That Are Off by Default.
Im folgenden Beispiel wird C4191 generiert:
// 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
};