C4793 de aviso (nível 1 e 3) do compilador
'função' : função é compilada como código nativo: 'razão'
O compilador não é possível compilar função código gerenciado, mesmo que o /clr opção de compilador é especificada. Em vez disso, o compilador emite uma mensagem explicativa continuação e aviso de C4793 e, em seguida, compila função em código nativo. A mensagem de continuação contém o motivo o texto que explica o motivo função não pode ser compilada para MSIL.
Este é um aviso de nível 1 ao especificar o /clr:pure opção de compilador.
A tabela a seguir lista todas as mensagens de continuação possíveis.
Mensagem do motivo |
Remarks |
---|---|
Não há suporte para tipos de dados alinhados em código gerenciado |
O CLR deve ser capaz de alocar os dados conforme necessário, que talvez não seja possível se os dados alinhados com declarações como __m128 ou Alinhar. |
Funções de '__ImageBase' Não há suporte para o código gerenciado |
__ImageBaseé um símbolo especial de vinculador que normalmente é usado somente pelo código nativo de baixo nível para carregar uma DLL. |
Não há suporte para varargs a ' / clr' opção de compilador |
Funções nativas não podem chamar funções gerenciadas que tenham a lista de argumento variável (varargs) porque as funções têm requisitos de layout de pilha diferentes. No entanto, se você especificar o /clr:pure opção de compilador, o argumento variável listas têm suporte porque o assembly pode conter apenas gerenciado funções. For more information, see Código puro e verificável. |
O CLR de 64 bits não suporta dados declarados com o modificador de __ptr32 |
Um ponteiro deve ser do mesmo tamanho que um ponteiro nativo na plataforma atual. For more information, see __ptr32, __ptr64. |
O CLR de 32 bits não suporta dados declarados com o modificador de __ptr64 |
Um ponteiro deve ser do mesmo tamanho que um ponteiro nativo na plataforma atual. For more information, see __ptr32, __ptr64. |
Intrínsecos de um ou mais não é suportado no código gerenciado |
O nome do intrínsecos não está disponível no momento em que a mensagem é emitida. No entanto, um valor intrínseco que faz com que essa mensagem normalmente representa uma instrução de baixo nível de máquina. |
Não há suporte para o assembly de nativo embutido ('__asm') em código gerenciado |
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 nativo |
Um não-__clrcall thunk de função virtual deve usar um endereço não gerenciado. |
Uma função usando '_setjmp' deve ser compilado como nativo |
O CLR deve ser capaz de controlar a execução do programa. No entanto, o setjmp função ignora a execução do programa regular, salvando e restaurando informações de baixo nível, como registradores e o estado de execução. |
Exemplo
O exemplo a seguir gera C4793.
// C4793.cpp
// compile with: /c /clr /W3
// processor: x86
int asmfunc(void) { // C4793, compiled as unmanaged, native code
__asm {
mov eax, 0
}
}
O exemplo a seguir gera C4793.
// C4793_b.cpp
// compile with: /c /clr /W3
#include <setjmp.h>
jmp_buf test_buf;
void f() {
setjmp(test_buf); // C4793 warning
}