Share via


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