Udostępnij za pośrednictwem


Kompilator ostrzeżenia (poziom 1 i 3) C4793

"Funkcja": funkcja jest kompilowany jako kodu macierzystego: "przyczyny"

Kompilator nie można skompilować funkcji do kodu zarządzanego, nawet jeśli /CLR określono opcję kompilatora.Zamiast tego, kompilator emituje ostrzeżenie C4793 i komunikat wyjaśniający kontynuacji i następnie kompiluje funkcji do kodu macierzystego.Wiadomość kontynuację zawiera Przyczyna tekst, który wyjaśnia, dlaczego funkcji nie można skompilować do MSIL.

Jest to poziom 1 ostrzeżenie podczas określania /clr:pure opcję kompilatora.

Poniższa tabela zawiera listę wszystkich wiadomości ewentualnej kontynuacji.

Przyczyny komunikatu

Uwagi

Typy wyrównane dane nie są obsługiwane w kodzie zarządzanym.

Środowisko CLR musi być w stanie przydzielić danych, w razie potrzeby, która może być niemożliwe, jeśli dane są wyrównane z deklaracjami, takich jak __m128 lub wyrównać.

Funkcje korzystające z "__ImageBase" nie są obsługiwane w kodzie zarządzanym.

__ImageBasejest symbolem specjalny program łączący, który zazwyczaj jest używany tylko przez niskiego poziomu kodu macierzystego do załadowania biblioteki DLL.

typu VarArgs nie są obsługiwane przez ' / clr' opcję kompilatora

Funkcje macierzysty nie można wywołać zarządzane funkcje, które mają Wyświetla listę zmiennych, argument (typu varargs) ponieważ wymagania układu stosu różne funkcje.Jednakże jeśli zostanie określony /clr:pure opcję kompilatora, zmiennym argumentem list są obsługiwane, ponieważ zestaw może zawierać tylko funkcje zarządzania.Aby uzyskać więcej informacji, zobacz Kod czystej i zweryfikowania (C + +/ CLI).

CLR 64-bitowe nie obsługuje danych zgłoszonych przy pomocy modyfikatora __ptr32

Wskaźnik musi być taki sam rozmiar jak native wskaźnik na bieżącej platformie.Aby uzyskać więcej informacji, zobacz __ptr32, __ptr64.

32-Bitowe środowisko CLR nie obsługuje danych zgłoszonych przy pomocy modyfikatora __ptr64

Wskaźnik musi być taki sam rozmiar jak native wskaźnik na bieżącej platformie.Aby uzyskać więcej informacji, zobacz __ptr32, __ptr64.

Jeden lub więcej intrinsics nie jest obsługiwana w kodzie zarządzanym.

Nazwa wewnętrzna nie jest dostępny w czasie, który jest emitowany komunikat.Jednakże wewnętrzna, która powoduje, że ten komunikat zwykle reprezentuje instrukcji maszyny niskiego poziomu.

Zgromadzenie macierzystym wbudowanej (__asm) nie jest obsługiwana w kodzie zarządzanym.

Wbudowany zestaw kodu może zawierać dowolnego kodu macierzystego, które nie mogą być zarządzane.

Thunk funkcję wirtualną non __clrcall musi zostać skompilowany jako macierzysty

Non-__clrcall funkcję wirtualną thunk należy użyć adresu niezarządzanego.

Funkcję za pomocą '_setjmp' musi zostać skompilowany jako macierzysty

CLR musi być w stanie kontrolować wykonywanie programów.Jednakże setjmp funkcji pomija wykonywanie regularnych programów poprzez zapisywanie i przywracanie niskiego poziomu informacji, takich jak rejestrów i stan wykonania.

Przykład

Poniższy przykład generuje C4793.

// C4793.cpp
// compile with: /c /clr /W3 
// processor: x86
int asmfunc(void) {   // C4793, compiled as unmanaged, native code
   __asm {
      mov eax, 0
   }
}
  

Poniższy przykład generuje C4793.

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

void f() {
   setjmp(test_buf);   // C4793 warning
}