Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
"function" : funkcja jest kompilowana jako kod natywny: "reason"
Uwagi
Kompilator nie może skompilować funkcji w kodzie zarządzanym, mimo że określono opcję kompilatora /clr . Zamiast tego kompilator emituje ostrzeżenie C4793 i komunikat kontynuacji objaśnienia, a następnie kompiluje funkcję w kodzie natywnym. Komunikat kontynuacji zawiera tekst przyczyny , który wyjaśnia, dlaczego nie można skompilować funkcji w pliku MSIL.
Jest to ostrzeżenie poziomu 1 po określeniu opcji /clr:pure compiler. Opcja /clr:pure compiler jest przestarzała w programie Visual Studio 2015 i nieobsługiwana w programie Visual Studio 2017.
W poniższej tabeli wymieniono wszystkie możliwe komunikaty kontynuacji.
| Komunikat o przyczynie | Uwagi |
|---|---|
| Wyrównane typy danych nie są obsługiwane w kodzie zarządzanym | ClR musi być w stanie przydzielić dane zgodnie z potrzebami, co może nie być możliwe, jeśli dane są dopasowane do deklaracji, takich jak __m128 lub wyrównać. |
| Funkcje korzystające z funkcji "__ImageBase" nie są obsługiwane w kodzie zarządzanym |
__ImageBase to specjalny symbol konsolidatora, który jest zwykle używany tylko przez kod natywny niskiego poziomu do załadowania biblioteki DLL. |
| varargs nie są obsługiwane przez opcję kompilatora "/clr" | Funkcje natywne nie mogą wywoływać funkcji zarządzanych, które mają listy argumentów zmiennych (varargs), ponieważ funkcje mają różne wymagania dotyczące układu stosu. Jeśli jednak określisz opcję /clr:pure compiler, listy argumentów zmiennych są obsługiwane, ponieważ zestaw może zawierać tylko funkcje zarządzane. Aby uzyskać więcej informacji, zobacz Pure and Verifiable Code (C++/CLI). |
| 64-bitowa clR nie obsługuje danych zadeklarowanych za pomocą modyfikatora __ptr32 | Wskaźnik musi być taki sam jak natywny wskaźnik na bieżącej platformie. Aby uzyskać więcej informacji, zobacz __ptr32, __ptr64. |
| 32-bitowa clR nie obsługuje danych zadeklarowanych za pomocą modyfikatora __ptr64 | Wskaźnik musi być taki sam jak natywny wskaźnik na bieżącej platformie. Aby uzyskać więcej informacji, zobacz __ptr32, __ptr64. |
| Co najmniej jedna funkcja wewnętrzna nie jest obsługiwana w kodzie zarządzanym | Nazwa funkcji wewnętrznej nie jest dostępna w momencie emitowania komunikatu. Jednak element wewnętrzny, który powoduje, że ten komunikat zazwyczaj reprezentuje instrukcję maszyny niskiego poziomu. |
| Wbudowany zestaw natywny ('__asm') nie jest obsługiwany w kodzie zarządzanym | Wbudowany kod zestawu może zawierać dowolny kod natywny, którego nie można zarządzać. |
| Funkcja wirtualna innej niż __clrcall musi być skompilowana jako natywna | Funkcja wirtualna bez __clrcall musi używać adresu niezarządzanego. |
| Funkcja używająca funkcji "_setjmp" musi być skompilowana jako natywna | ClR musi być w stanie kontrolować wykonywanie programu. Jednak funkcja setjmp pomija regularne wykonywanie programu, zapisując i przywracając informacje niskiego poziomu, takie jak rejestry i stan wykonywania. |
Przykłady
Poniższy przykład generuje kod 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
Poniższy przykład generuje kod 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