Avviso del compilatore (livelli 1 e 3) C4793
'funzione': funzione compilata come nativa: 'causa'
Il compilatore non è in grado di compilare la function nel 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 function nel codice nativo. Il messaggio di continuazione contiene il testo relativo alla reason per la quale non è stato possibile eseguire la compilazione della function 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 |
Osservazioni |
---|---|
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
}