Compilerwarnung (Stufe 1 und 3) C4793
'Funktion': Funktion wird als systemeigener Code kompiliert: 'Reason'
Hinweise
Der Compiler kann die Funktion nicht in verwalteten Code kompilieren, obwohl die Compileroption "/clr" angegeben ist. Stattdessen gibt der Compiler die Warnung C4793 und eine erläuternde Fortsetzungsmeldung aus und kompiliert dann die Funktion in systemeigenem Code. Die Fortsetzungsmeldung enthält den Grundtext , der erläutert, warum die Funktion nicht kompiliert MSIL
werden kann.
Dies ist eine Warnung der Ebene 1, wenn Sie die Option "/clr:pure compiler" angeben. Die Option "/clr:pure compiler" ist in Visual Studio 2015 veraltet und wird in Visual Studio 2017 nicht unterstützt.
In der folgenden Tabelle sind alle möglichen Fortsetzungsmeldungen aufgeführt.
Reason message | Hinweise |
---|---|
Ausgerichtete Datentypen werden in verwaltetem Code nicht unterstützt. | Die CLR muss nach Bedarf Daten zuordnen können, was möglicherweise nicht möglich ist, wenn die Daten an Deklarationen wie __m128 oder ausrichten. |
Funktionen, die "__ImageBase" verwenden, werden in verwaltetem Code nicht unterstützt. | __ImageBase ist ein spezielles Linkersymbol, das in der Regel nur von systemeigenem Code auf niedriger Ebene zum Laden einer DLL verwendet wird. |
varargs werden von der Compileroption "/clr" nicht unterstützt. | Systemeigene Funktionen können keine verwalteten Funktionen mit Variablenargumentlisten (Varargs) aufrufen, da die Funktionen unterschiedliche Stapellayoutanforderungen aufweisen. Wenn Sie jedoch die Option "/clr:pure compiler" angeben, werden Variablenargumentlisten unterstützt, da die Assembly nur verwaltete Funktionen enthalten kann. Weitere Informationen finden Sie unter Pure and Verifiable Code (C++/CLI).For more information, see Pure and Verifiable Code (C++/CLI). |
Die 64-Bit-CLR unterstützt keine Mit dem __ptr32 Modifizierer deklarierten Daten. | Ein Zeiger muss dieselbe Größe wie ein systemeigener Zeiger auf der aktuellen Plattform aufweisen. Weitere Informationen finden Sie unter __ptr32, __ptr64. |
Die 32-Bit-CLR unterstützt keine Mit dem __ptr64 Modifizierer deklarierten Daten. | Ein Zeiger muss dieselbe Größe wie ein systemeigener Zeiger auf der aktuellen Plattform aufweisen. Weitere Informationen finden Sie unter __ptr32, __ptr64. |
Mindestens ein systeminternes Element wird in verwaltetem Code nicht unterstützt. | Der Name des systeminternen Ist zum Zeitpunkt des Sendens der Nachricht nicht verfügbar. Eine systeminterne Meldung, die diese Nachricht verursacht, stellt jedoch in der Regel eine Computeranweisung auf niedriger Ebene dar. |
Inline native Assembly ('__asm') wird in verwaltetem Code nicht unterstützt. | Inlineassemblycode kann beliebigen systemeigenen Code enthalten, der nicht verwaltet werden kann. |
Eine nicht __clrcall virtuelle Funktion Thunk muss als systemeigene Funktion kompiliert werden. | Eine nicht __clrcall virtuelle Funktion Thunk muss eine nicht verwaltete Adresse verwenden. |
Eine Funktion mit "_setjmp" muss als systemeigene Kompilierung erstellt werden. | Die CLR muss in der Lage sein, die Programmausführung zu steuern. Die Setjmp-Funktion umgeht jedoch die normale Programmausführung, indem Informationen auf niedriger Ebene wie Register und Ausführungszustand gespeichert und wiederhergestellt werden. |
Beispiel
Im folgenden Beispiel wird C4793 generiert.
// 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
Im folgenden Beispiel wird C4793 generiert.
// 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