Condividi tramite


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
}