Advertencia del compilador (niveles 1 y 3) C4793
"function": la función se compila como código nativo: "reason"
Comentarios
El compilador no puede compilar function en código administrado, incluso si se especifica la opción del compilador /clr. En su lugar, el compilador emite la advertencia C4793 y un mensaje de continuación explicativo y, a continuación, compila function en código nativo. El mensaje de continuación contiene el texto reason que explica por qué function no se puede compilar en MSIL
.
Se trata de una advertencia de nivel 1 cuando se especifica la opción del compilador /clr:pure. La opción del compilador /clr:pure está en desuso en Visual Studio 2015 y no se admite en Visual Studio 2017.
En la tabla siguiente, se enumeran todos los mensajes de continuación posibles.
Mensaje de motivo | Comentarios |
---|---|
Los tipos de datos alineados no se admiten en el código administrado | CLR debe ser capaz de asignar datos según sea necesario, lo que podría no ser posible si los datos están alineados con declaraciones como __m128 o align. |
Las funciones que usan "__ImageBase" no se admiten en el código administrado | __ImageBase es un símbolo de enlazador especial que habitualmente solo se usa en código nativo de bajo nivel para cargar un archivo DLL. |
La opción del compilador "/clr" no admite atributos vararg | Las funciones nativas no pueden llamar a funciones administradas que tienen listas de argumentos de variables (varargs), porque las funciones tienen requisitos de diseño de pila diferentes. Sin embargo, si especifica la opción del compilador /clr:pure, se admiten listas de argumentos de variables porque el ensamblado solo puede contener funciones administradas. Para más información, consulte Código puro y comprobable (C++/CLI). |
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 más información, consulte __ptr32, __ptr64. |
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 más información, consulte __ptr32, __ptr64. |
No se admiten uno o más intrínsecos en el código administrado | El nombre del intrínseco no está disponible en el momento en que se emite el mensaje. Sin embargo, un intrínseco que provoca este mensaje representa, por lo general, una instrucción de máquina de bajo nivel. |
Ensamblado nativo insertado ("__asm") no admitido en código administrado | El código de ensamblado insertado puede contener código nativo arbitrario, el que no se puede administrar. |
El código thunk de una función virtual que no es __clrcall se debe compilar como nativo | El código thunk de una función vrtual que no es __clrcall debe usar una dirección no administrada. |
Una función que usa "_setjmp" se debe compilar como nativa | CLR debe ser capaz de controlar la ejecución del programa. Sin embargo, la función setjmp omite la ejecución normal del programa al guardar y restaurar información de bajo nivel, como los registros y el estado de la ejecución. |
Ejemplo
El ejemplo siguiente genera la advertencia 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
El ejemplo siguiente genera la advertencia 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