Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 3, wyłączony) C4191

"operation": niebezpieczna konwersja z "type_of_expression" na "type_required"
Wykonywanie wywołania funkcji przy użyciu wynikowego wskaźnika może spowodować niepowodzenie programu

Kilka operacji obejmujących wskaźniki funkcji jest uważanych za niebezpieczne:

  • Typy funkcji z różnymi konwencjami wywoływania.

  • Typy funkcji z różnymi konwencjami zwracania.

  • Typy argumentów lub zwracane z różnymi rozmiarami, kategoriami typów lub klasyfikacjami.

  • Różne długości listy argumentów (w systemie tylko w __cdeclprzypadku rzutowania z dłuższej listy do krótszej listy, nawet jeśli krótsza jest varargs).

  • Wskaźnik do danych (innych niż void*) aliasy względem wskaźnika do funkcji.

  • Każda inna różnica typu, która spowoduje wyświetlenie błędu lub ostrzeżenia dla elementu reinterpret_cast.

Wywołanie tej funkcji za pośrednictwem wskaźnika wyników może spowodować awarię programu.

To ostrzeżenie jest domyślnie wyłączone. Aby uzyskać więcej informacji, zobacz Ostrzeżenia kompilatora, które są domyślnie wyłączone.

Poniższy przykład generuje 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
};