Sdílet prostřednictvím


Upozornění kompilátoru (úroveň 1 a 3) C4793

'function' : funkce je zkompilována jako nativní kód: 'reason'

Poznámky

Kompilátor nemůže zkompilovat funkci do spravovaného kódu, i když je zadána možnost kompilátoru /clr . Místo toho kompilátor generuje upozornění C4793 a vysvětlující zprávu o pokračování a pak zkompiluje funkci do nativního kódu. Zpráva o pokračování obsahuje text důvodu , který vysvětluje, proč funkci nelze zkompilovat do MSIL.

Toto je upozornění úrovně 1 při zadání možnosti /clr:pure compiler. Možnost /clr:pure compiler je v sadě Visual Studio 2015 zastaralá a v sadě Visual Studio 2017 není podporována.

Následující tabulka uvádí všechny možné zprávy o pokračování.

Zpráva o důvodu Poznámky
Zarovnané datové typy nejsou ve spravovaném kódu podporovány. Modul CLR musí být schopen podle potřeby přidělit data, což nemusí být možné, pokud jsou data v souladu s deklaracemi, jako je __m128 nebo zarovnaná.
Funkce, které používají __ImageBase, se ve spravovaném kódu nepodporují. __ImageBase je speciální symbol linkeru, který se obvykle používá pouze nativním kódem nízké úrovně k načtení knihovny DLL.
Možnost kompilátoru /clr nepodporuje varargs. Nativní funkce nemůžou volat spravované funkce, které mají seznamy argumentů proměnných (varargs), protože tyto funkce mají různé požadavky na rozložení zásobníku. Pokud však zadáte možnost /clr:pure compiler, podporují se seznamy argumentů proměnných, protože sestavení může obsahovat pouze spravované funkce. Další informace naleznete v tématu Čistý a ověřitelný kód (C++/CLI).
64bitový modul CLR nepodporuje data deklarovaná pomocí modifikátoru __ptr32. Ukazatel musí mít stejnou velikost jako nativní ukazatel na aktuální platformě. Další informace najdete v tématu __ptr32, __ptr64.
32bitový modul CLR nepodporuje data deklarovaná pomocí modifikátoru __ptr64. Ukazatel musí mít stejnou velikost jako nativní ukazatel na aktuální platformě. Další informace najdete v tématu __ptr32, __ptr64.
Jeden nebo více vnitřních objektů není ve spravovaném kódu podporováno. V době, kdy se zpráva vygeneruje, není název vnitřní objektu k dispozici. Vnitřní objekt, který způsobuje, že tato zpráva obvykle představuje instrukce počítače nízké úrovně.
Vložené nativní sestavení (__asm) se ve spravovaném kódu nepodporuje. Vložený kód sestavení může obsahovat libovolný nativní kód, který nelze spravovat.
Ne __clrcall virtuální blok funkce musí být zkompilován jako nativní. Nespravovaná adresa musí používat nespravovanou adresu, která není __clrcall virtuální funkce.
Funkce používající "_setjmp" musí být zkompilována jako nativní. Modul CLR musí být schopen řídit provádění programu. Funkce setjmp však obchází pravidelné provádění programu uložením a obnovením informací nízké úrovně, jako jsou registry a stav spuštění.

Příklad

Následující ukázka vygeneruje C4793.

// C4793.cpp
// compile with: /c /clr /W3
// processor: x86
int asmfunc(void) {   // C4793, compiled as unmanaged, native code
   __asm {
      mov eax, 0
   }
}
warning C4793: 'asmfunc' : function is compiled as native code:
        Inline native assembly ('__asm') is not supported in managed code

Následující ukázka vygeneruje C4793.

// C4793_b.cpp
// compile with: /c /clr /W3
#include <setjmp.h>
jmp_buf test_buf;

void f() {
   setjmp(test_buf);   // C4793 warning
}
warning C4793: 'f' : function is compiled as native code:
        A function using '_setjmp' must be compiled as native