Aviso do compilador (nível 1 e 3) C4793
'function' : a função é compilada como código nativo: 'reason'
Comentários
O compilador não pode compilar a função no código gerenciado, mesmo que a opção do compilador /clr esteja especificada. Em vez disso, o compilador emite o aviso C4793 e uma mensagem de continuação explicativa e, em seguida, compila a função em código nativo. A mensagem de continuação contém o texto de motivo que explica por que a função não pode ser compilada para MSIL
.
Esse é um aviso de nível 1 quando você especifica a opção do compilador /clr:pure. A opção do compilador /clr:pure foi preterida no Visual Studio 2015 e está sem suporte no Visual Studio 2017.
A tabela a seguir lista todas as mensagens de continuação possíveis.
Mensagem de motivo | Comentários |
---|---|
Tipos de dados alinhados não têm suporte em código gerenciado | O CLR deve ser capaz de alocar dados conforme necessário, o que pode não ser possível se os dados estiverem alinhados com declarações como __m128 ou alinhar. |
Não há suporte para funções que usam '__ImageBase' no código gerenciado | __ImageBase é um símbolo de vinculador especial que normalmente é usado apenas por código nativo de baixo nível para carregar uma DLL. |
não há suporte para varargs pela opção do compilador '/clr' | As funções nativas não podem chamar funções gerenciadas que têm listas de argumentos variáveis (varargs) porque as funções têm requisitos diferentes de layout empilhado. No entanto, se você especificar a opção do compilador /clr:pure, haverá suporte para listas de argumentos variáveis, porque o assembly pode conter apenas funções gerenciadas. Para obter mais informações, consulte Código Puro e Verificável (C++/CLI). |
O CLR de 64 bits não dá suporte a dados declarados com o modificador __ptr32 | Um ponteiro deve ter o mesmo tamanho de um ponteiro nativo na plataforma atual. Para obter mais informações, consulte __ptr32, __ptr64. |
O CLR de 32 bits não dá suporte a dados declarados com o modificador __ptr64 | Um ponteiro deve ter o mesmo tamanho de um ponteiro nativo na plataforma atual. Para obter mais informações, consulte __ptr32, __ptr64. |
Não há suporte para um ou mais intrínsecos no código gerenciado | O nome do intrínseco não está disponível no momento em que a mensagem é emitida. No entanto, um intrínseco que causa essa mensagem normalmente representa uma instrução de computador de baixo nível. |
Assembly nativo embutido ('__asm') não tem suporte no código gerenciado | O código de assembly embutido pode conter código nativo arbitrário, que não pode ser gerenciado. |
Uma conversão de função virtual não __clrcall deve ser compilada como nativa | Uma conversão de função virtual não __clrcall deve usar um endereço não gerenciado. |
Uma função que usa '_setjmp' deve ser compilada como nativa | O CLR deve ser capaz de controlar a execução do programa. No entanto, a função setjmp ignora a execução regular do programa salvando e restaurando informações de baixo nível, como registros e estado de execução. |
Exemplo
O exemplo a seguir gera o aviso 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
O exemplo a seguir gera o aviso 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