Partilhar via


Aviso do compilador (nível 1 e 3) C4793

'função' : a função é compilada como código nativo: 'razão'

Observações

O compilador não pode compilar a função em código gerenciado, mesmo que a opção de compilador /clr seja especificada. Em vez disso, o compilador emite 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 do motivo que explica por que a função não pode ser compilada para MSIL.

Este é um aviso de nível 1 quando você especifica a opção de compilador /clr:pure . A opção de compilador /clr:pure foi preterida no Visual Studio 2015 e não tem suporte no Visual Studio 2017.

A tabela a seguir lista todas as mensagens de continuação possíveis.

Mensagem de motivo Observações
Tipos de dados alinhados não são suportados no 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.
Funções que usam '__ImageBase' não são suportadas 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.
varargs não são suportados pela opção de compilador '/clr' As funções nativas não podem chamar funções gerenciadas que tenham listas de argumentos variáveis (varargs) porque as funções têm requisitos de layout de pilha diferentes. No entanto, se você especificar a opção de compilador /clr:pure , as listas de argumentos variáveis serão suportadas 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 suporta dados declarados com o modificador __ptr32 O tamanho de um ponteiro deve ser igual ao de um ponteiro nativo na plataforma atual. Para obter mais informações, consulte __ptr32, __ptr64.
O CLR de 32 bits não suporta 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.
Uma ou mais intrínsecas não são suportadas 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 máquina de baixo nível.
O assembly nativo embutido ('__asm') não é suportado no código gerenciado O código de assembly embutido pode conter código nativo arbitrário, que não pode ser gerenciado.
Uma função virtual não __clrcall thunk deve ser compilada como nativa Uma função virtual não __clrcall thunk deve usar um endereço não gerenciado.
Uma função usando '_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.

Examples

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
   }
}
warning C4793: 'asmfunc' : function is compiled as native code:
        Inline native assembly ('__asm') is not supported in managed code

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
}
warning C4793: 'f' : function is compiled as native code:
        A function using '_setjmp' must be compiled as native