Compartilhar via


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