Upozornění kompilátoru (úroveň 3, vypnuto) C4191
Operace: nebezpečný převod z type_of_expression na type_required
Volání funkce pomocí výsledného ukazatele může způsobit selhání programu
Několik operací zahrnujících ukazatele funkcí se považuje za nebezpečné:
Typy funkcí s různými konvencemi volání
Typy funkcí s různými návratovými konvencemi
Argumenty nebo návratové typy s různými velikostmi, kategoriemi typů nebo klasifikacemi
Různé délky seznamu argumentů (zapnuto
__cdecl
, pouze při přetypování z delšího seznamu na kratší seznam, i když je kratší je varargs).Ukazatel na data (jiné než
void*
) aliasy vůči ukazateli na funkci.Jakýkoli jiný rozdíl typu, který by přinesl chybu nebo upozornění na
reinterpret_cast
.
Volání této funkce pomocí ukazatele výsledku může způsobit chybové ukončení programu.
Toto upozornění je ve výchozím nastavení vypnuté. Další informace najdete v tématu Upozornění kompilátoru, která jsou ve výchozím nastavení vypnutá.
Následující ukázka vygeneruje 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
};