Dela via


Kompilatorvarning (nivå 3, av) C4191

"operation": osäker konvertering från "type_of_expression" till "type_required"
Om du gör ett funktionsanrop med hjälp av den resulterande pekaren kan programmet misslyckas

Anmärkningar

Flera åtgärder som rör funktionspekare anses vara osäkra:

  • Funktionstyper med olika anropskonventioner.

  • Funktionstyper med olika returkonventioner.

  • Argument- eller returtyper med olika storlekar, typkategorier eller klassificeringar.

  • Skillnader i argumentlistans längd (på __cdecl, endast vid typomvandling från en längre lista till en kortare lista, även om den kortare är varargs).

  • Pekare till data (förutom void*) som är aliaserad mot en funktionspekare.

  • Alla andra typer av skillnader som skulle ge ett fel eller en varning på en reinterpret_cast.

Om du anropar den här funktionen via resultatpekaren kan programmet krascha.

Den här varningen är inaktiverad som standard. Mer information finns i Kompilatorvarningar som är inaktiverade som standard.

Example

I följande exempel genereras 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
}