Freigeben über


Compilerwarnung (Stufe 3) C4191

Aktualisiert: November 2007

Fehlermeldung

'Operator/Operation': Unsichere Konvertierung von 'Ausdruckstyp' in 'erforderlichen Typ'
'operator/operation' : unsafe conversion from 'type of expression' to 'type required'

Mehrere Operationen, die Funktionszeiger enthalten, werden als unsicher angesehen:

  • Funktionstypen mit unterschiedlichen Aufrufkonventionen.

  • Funktionstypen mit unterschiedlichen Rückgabekonventionen.

  • Argument- oder Rückgabetypen, deren Größen, Typkategorien oder Klassifizierungen unterschiedlich sind.

  • Argumentlisten unterschiedlicher Länge (für __cdecl lediglich bei der Typumwandlung von einer längeren zu einer kürzeren Liste, selbst wenn die kürzere Liste varargs entspricht).

  • Zeiger auf Daten (außer void*-Daten), als Alias für einen Zeiger auf eine Funktion.

  • Alle weiteren Typunterschiede, die bei Verwendung von reinterpret_cast einen Fehler oder eine Warnung verursachen würden.

Ein Aufruf dieser Funktion über den Ergebniszeiger kann zum Programmabsturz führen.

Diese Warnung ist standardmäßig deaktiviert. Weitere Informationen finden Sie unter Standardmäßig deaktivierte Compilerwarnungen.

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