C4793 de aviso (nível 1 e 3) do compilador
'função': função é compilada como código nativo: 'motivo'
O compilador não é possível compilar função em código gerenciado, mesmo que o /clr opção de compilador é especificada.Em vez disso, o compilador emite avisos C4793 e uma mensagem explicativa continuação 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 |
Comentários |
---|---|
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 são alinhados com declarações como __m128 ou Alinhar. |
Funções que usam a '__ImageBase' não são suportadas em 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. |
varargs não são suportados pelo ' / clr' opção de compilador |
Funções nativas não é possível chamar funções gerenciadas que tenham a lista de argumentos 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, as listas têm suporte porque o assembly pode conter somente funções gerenciadas de argumentos variável.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 de __ptr32 |
Um ponteiro deve ser do mesmo tamanho que 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 de __ptr64 |
Um ponteiro deve ser do mesmo tamanho que um ponteiro nativo na plataforma atual.Para obter mais informações, consulte __ptr32, __ptr64. |
Não há suporte para um ou mais intrínsecos em 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 esta 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 deverá usar um endereço de não gerenciado. |
Uma função usando '_setjmp' deve ser compilada 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
}