Compilerwarnung (Stufe 1 und 3) C4793

Aktualisiert: November 2007

Fehlermeldung

'Funktion': Funktion wird als systemeigener Code kompiliert: 'Grund'
'function' : function is compiled as native code: 'reason'

Der Compiler kann function nicht in verwalteten Code kompilieren, auch wenn die /clr-Compileroption angegeben wird. Der Compiler gibt stattdessen Warnung C4793 und eine Meldung mit Erläuterungen zur Fortsetzung aus und kompiliert anschließendfunction in systemeigenen Code. Die Fortsetzungsmeldung enthält in reason die Erläuterung, warum function nicht in MSIL kompiliert werden kann.

Dies ist eine Warnung der Stufe 1, wenn Sie die /clr:pure-Compileroption angeben.

In der folgenden Tabelle werden alle möglichen Fortsetzungsmeldungen aufgelistet.

Meldung mit Grund

Hinweise

Ausgerichtete Datentypen werden in verwaltetem Code nicht unterstützt.

Die CLR muss Daten nach Bedarf zuordnen können, was unter Umständen nicht möglich ist, wenn die Daten mit Deklarationen wie __m128 oder align ausgerichtet sind.

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 aufrufen, die über Variablenargumentlisten (varargs) verfügen, da für die Funktionen andere Stapellayoutanforderungen gelten. Wenn Sie aber die /clr:pure-Compileroption angeben, werden Variablenargumentlisten unterstützt, da die Assembly nur verwaltete Funktionen enthalten kann. Weitere Informationen finden Sie unter Reiner und überprüfbarer Code.

Daten, die mit dem Modifizierer __ptr32 deklariert wurden, werden von der 64-Bit-CLR nicht unterstützt.

Ein Zeiger muss die gleiche Größe wie ein systemeigener Zeiger auf der aktuellen Plattform haben. Weitere Informationen finden Sie unter __ptr32, __ptr64.

Daten, die mit dem Modifizierer __ptr64 deklariert wurden, werden von der 32-Bit-CLR nicht unterstützt.

Ein Zeiger muss die gleiche Größe wie ein systemeigener Zeiger auf der aktuellen Plattform haben. Weitere Informationen finden Sie unter __ptr32, __ptr64.

Eine oder mehrere systeminterne Funktionen werden in verwaltetem Code nicht unterstützt.

Der Name der systeminternen Funktion ist zum Zeitpunkt der Ausgabe der Meldung nicht verfügbar. Aber eine systeminterne Funktion, die diese Meldung verursacht, stellt i. d. R. eine Computeranweisung auf niedriger Ebene dar.

Die systemeigene Inlineassembly __asm wird in verwaltetem Code nicht unterstützt.

Inlineassemblycode kann beliebigen systemeigenen Code enthalten, der nicht verwaltet werden kann.

Ein virtueller Funktionsthunk muss als systemeigen kompiliert werden, wenn es sich nicht um den Typ __clrcall handelt.

Ein virtueller Funktionsthunk, bei dem es sich nicht um den Typ __clrcall handelt, muss eine nicht verwaltete Adresse verwenden.

Eine Funktion, die _setjmp verwendet, muss als systemeigen kompiliert werden.

Die CLR muss zur Steuerung der Programmausführung in der Lage sein. Die setjmp-Funktion umgeht jedoch die reguläre Programmausführung durch Speicherung und Wiederherstellung von Informationen auf niedriger Ebene wie Register und Ausführungsstatus.

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