Condividi tramite


Avviso del compilatore (livelli 1 e 3) C4793

'function': la funzione viene compilata come codice nativo: 'reason'

Osservazioni:

Il compilatore non può compilare la funzione in codice gestito, anche se è specificata l'opzione del compilatore /clr . Il compilatore genera invece l'avviso C4793 e un messaggio di continuazione esplicativo e quindi compila la funzione nel codice nativo. Il messaggio di continuazione contiene il testo motivo che spiega perché la funzione non può essere compilata in MSIL.

Si tratta di un avviso di livello 1 quando si specifica l'opzione del compilatore /clr:pure . L'opzione del compilatore /clr:pure è deprecata in Visual Studio 2015 e non supportata in Visual Studio 2017.

Nella tabella seguente sono elencati tutti i possibili messaggi di continuazione.

Messaggio motivo Osservazioni:
I tipi di dati allineati non sono supportati nel codice gestito CLR deve essere in grado di allocare i dati in base alle esigenze, che potrebbero non essere possibili se i dati sono allineati a dichiarazioni quali __m128 o allineamento.
Le funzioni che usano '__ImageBase' non sono supportate nel codice gestito __ImageBase è un simbolo speciale del linker usato in genere solo da codice nativo di basso livello per caricare una DLL.
Varargs non è supportato dall'opzione del compilatore '/clr' Le funzioni native non possono chiamare funzioni gestite con elenchi di argomenti variabili (varargs) perché le funzioni hanno requisiti di layout dello stack diversi. Tuttavia, se si specifica l'opzione del compilatore /clr:pure , gli elenchi di argomenti delle variabili sono supportati perché l'assembly può contenere solo funzioni gestite. Per altre informazioni, vedere Codice puro e verificabile (C++/CLI).
CLR a 64 bit non supporta i dati dichiarati con il modificatore __ptr32 Un puntatore deve avere le stesse dimensioni di un puntatore nativo nella piattaforma corrente. Per altre informazioni, vedere __ptr32, __ptr64.
CLR a 32 bit non supporta i dati dichiarati con il modificatore __ptr64 Un puntatore deve avere le stesse dimensioni di un puntatore nativo nella piattaforma corrente. Per altre informazioni, vedere __ptr32, __ptr64.
Uno o più oggetti intrinseci non sono supportati nel codice gestito Il nome dell'intrinseco non è disponibile al momento dell'emissione del messaggio. Tuttavia, un intrinseco che causa questo messaggio rappresenta in genere un'istruzione computer di basso livello.
L'assembly nativo inline ('__asm') non è supportato nel codice gestito Il codice assembly inline può contenere codice nativo arbitrario, che non può essere gestito.
Una funzione virtuale non __clrcall deve essere compilata come nativa Una funzione virtuale non __clrcall deve usare un indirizzo non gestito.
Una funzione che usa '_setjmp' deve essere compilata come nativa CLR deve essere in grado di controllare l'esecuzione del programma. Tuttavia, la funzione setjmp ignora l'esecuzione regolare del programma salvando e ripristinando informazioni di basso livello, ad esempio registri e stato di esecuzione.

Esempio

L'esempio seguente genera l'errore 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

L'esempio seguente genera l'errore 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