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