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