Condividi tramite


Avviso del compilatore (livello 3, off) C4191

'operation': conversione non sicura da 'type_of_expression' a 'type_required'
L'esecuzione di una chiamata di funzione tramite il puntatore risultante può causare l'esito negativo del programma

Numerose operazioni in cui sono usati puntatori a funzione sono considerate non affidabili:

  • Tipi di funzione con diverse convenzioni di chiamata.

  • Tipi di funzione con diverse convenzioni di restituzione.

  • Tipi restituiti o tipi di argomento con diverse dimensioni, categorie di tipi o classificazioni.

  • Lunghezze di elenco di argomenti diverse (in __cdecl, solo su cast da elenco più lungo a elenco più breve, anche se più breve è varargs).

  • Puntatore ai dati (diverso da void*) con alias su un puntatore alla funzione.

  • Qualsiasi altra differenza di tipo che restituisce un errore o un avviso su un reinterpret_cast.

La chiamata di questa funzione tramite il puntatore risultante può causare l'arresto anomalo del programma.

Per impostazione predefinita, questo avviso non è attivo. Per altre informazioni, vedere Compiler Warnings That Are Off by Default.

L'esempio seguente genera l'errore 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
};