Avviso del compilatore (livelli 1 e 3) C4793
'funzione': funzione compilata come nativa: 'causa'
Il compilatore non è in grado di compilare la funzione in codice gestito, anche se è specificata l'opzione del compilatore /clr.Il compilatore genera invece l'avviso C4793 e un messaggio esplicativo per continuare la compilazione della funzione in codice nativo.Il messaggio di continuazione contiene il testo relativo alla causa per la quale non è stato possibile eseguire la compilazione della funzione in MSIL.
Quando si specifica l'opzione del compilatore /clr:pure l'avviso visualizzato è di livello 1.
Nella tabella riportata di seguito sono riportati tutti i possibili messaggi di continuazione.
Messaggio relativo alla causa |
Note |
---|---|
Tipi di dati allineati non supportati nel codice gestito |
CLR deve essere in grado di allocare dati in base alle necessità, operazione che potrebbe non essere possibile se i dati sono allineati con dichiarazioni quali __m128 o align. |
Le funzioni che utilizzano '__ImageBase' non sono supportate nel codice gestito |
__ImageBase è un simbolo del linker speciale che in genere viene utilizzato solo dal codice nativo di basso livello per caricare una DLL. |
Le funzioni varargs non sono supportate dall'opzione del compilatore '/clr' |
Le funzioni native non possono chiamare funzioni gestite che hanno elenchi di argomenti variabili (varargs) perché le funzioni hanno requisiti di layout di stack diversi.Se, tuttavia, si specifica l'opzione del compilatore /clr:pure, gli elenchi di argomenti variabili saranno supportati perché l'assembly può contenere solo funzioni gestite.Per ulteriori informazioni, vedere Codice pure 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 ulteriori 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 ulteriori informazioni, vedere __ptr32, __ptr64. |
Uno o più intrinseci non supportati nel codice gestito |
Il nome dell'intrinseco non è disponibile al momento della generazione del messaggio.Tuttavia, un intrinseco che causa questo messaggio rappresenta in genere un'istruzione del computer di basso livello. |
Assembly nativo inline ('__asm') non supportato nel codice gestito |
Il codice assembly inline può contenere codice nativo arbitrario che non può essere gestito. |
Un thunk di funzione virtuale non __clrcall deve essere compilato come nativo |
Un thunk di funzione virtuale non __clrcall deve utilizzare un indirizzo non gestito. |
Una funzione che utilizza '_setjmp' deve essere compilata come nativa |
CLR deve essere in grado di controllare l'esecuzione del programma.La funzione setjmp tuttavia ignora l'esecuzione normale del programma salvando e ripristinando le informazioni di basso livello quali registri e stato di esecuzione. |
Esempio
Nell'esempio seguente viene generato 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
}
}
Nell'esempio seguente viene generato 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
}