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