Advertencia del compilador (niveles 1 y 3) C4793

'función': la función está compilada como código nativo: 'razón'

El compilador no puede compilar la función en código administrado, aunque se haya especificado la opción del compilador /clr.En lugar de ello, el compilador emite la advertencia C4793 y un mensaje explicativo a continuación y, después, compila la función en código nativo.El mensaje que se muestra a continuación incluye la razón que explica por qué la función no puede compilarse en MSIL.

Se trata de una advertencia de nivel 1 cuando se especifica la opción del compilador /clr:pure.

En la siguiente tabla se muestran todos los mensajes que pueden incluirse a continuación del error.

Mensaje con la razón

Comentarios

Los tipos de datos alineados no se admiten en código administrado

CLR debe poder asignar datos en función de las necesidades, lo cual no es posible si los datos están alineados con declaraciones del tipo __m128 o align.

No se admiten funciones que utilizan '__ImageBase' en el código administrado

__ImageBase es un símbolo especial del vinculador utilizado únicamente por el código nativo de bajo nivel para cargar una DLL.

La opción del compilador '/clr' no admite varargs

Las funciones nativas no pueden llamar a funciones administradas que tienen listas de argumentos variables (varargs) porque las funciones presentan distintos requisitos de diseño de pila.No obstante, si especifica la opción del compilador /clr:pure, sí que se admiten listas de argumentos variables porque el ensamblado sólo puede contener funciones administradas.Para obtener más información, consulte Código puro y comprobable (C++/CLI).

El CLR de 64 bits no admite datos declarados con el modificador __ptr32

Un puntero debe tener el mismo tamaño que un puntero nativo en la plataforma actual.Para obtener más información, consulte __ptr32, __ptr64.

El CLR de 32 bits no admite datos declarados con el modificador __ptr64

Un puntero debe tener el mismo tamaño que un puntero nativo en la plataforma actual.Para obtener más información, consulte __ptr32, __ptr64.

No se admiten una o varias instrucciones intrínsecas en el código administrado

El nombre de la instrucción intrínseca no está disponible en el momento en que se emite el mensaje.Sin embargo, una instrucción intrínseca que origina este mensaje suele representar una instrucción máquina de bajo nivel.

No se admite el ensamblado nativo insertado ('__asm') en el código administrado

El código de ensamblado insertado puede incluir código nativo arbitrario, que no puede administrarse.

El código thunk de una función virtual distinta de __clrcall debe compilarse como código nativo

El código thunk de una función virtual distinta de __clrcall debe utilizar una dirección no administrada.

Una función que utilice '_setjmp' debe compilarse como nativa

El CLR debe ser capaz de controlar la ejecución de programas.Sin embargo, la función setjmp omite la ejecución normal de programas ya que guarda y restaura información de bajo nivel, como registros y el estado de ejecución.

Ejemplo

En el ejemplo siguiente, se genera el error C4793.

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

En el ejemplo siguiente, se genera el error C4793.

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

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