Aracılığıyla paylaş


Derleyici Uyarısı (düzey 3, kapalı) C4191

'operation': 'type_of_expression' ile 'type_required' güvenli olmayan dönüştürme
Sonuçta elde edilen işaretçiyi kullanarak işlev çağrısı yapmak programınızın başarısız olmasına neden olabilir

İşlev işaretçilerini içeren çeşitli işlemler güvenli değil olarak kabul edilir:

  • Farklı çağrı kurallarına sahip işlev türleri.

  • Farklı dönüş kurallarına sahip işlev türleri.

  • Farklı boyutlara, tür kategorilerine veya sınıflandırmalara sahip bağımsız değişken veya dönüş türleri.

  • Farklı bağımsız değişken listesi uzunlukları (üzerinde __cdecl, yalnızca daha uzun listeden daha kısa listeye, daha kısa olsa bile vararg'larda).

  • bir işlev işaretçisine karşı diğer adla geçen veri işaretçisi (dışında void*).

  • üzerinde hata veya uyarı veren diğer tür farkları reinterpret_cast.

Sonuç işaretçisi aracılığıyla bu işlevi çağırmak programınızın kilitlenmesine neden olabilir.

Bu uyarı varsayılan olarak kapalıdır. Daha fazla bilgi için bkz . Varsayılan Olarak Kapalı Olan Derleyici Uyarıları.

Aşağıdaki örnek C4191 oluşturur:

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