Avertissement du compilateur (niveaux 1 et 3) C4793
Mise à jour : novembre 2007
Message d'erreur
'fonction' : la fonction est compilée comme code natif : 'raison'
'function' : function is compiled as native code: 'reason'
Le compilateur ne peut pas compiler la fonction dans le code managé, bien que l'option /clr du compilateur soit spécifiée. À la place, le compilateur émet l'avertissement C4793 et un message de continuation explicatif, puis compile la fonction dans le code natif. Le message de continuation contient le texte de raison qui explique pourquoi la fonction ne peut pas être compilée dans MSIL.
Il s'agit d'un avertissement de niveau 1 émis lorsque vous spécifiez l'option /clr:puredu compilateur.
Le tableau suivant répertorie tous les messages de continuation potentiels.
Message de raison |
Notes |
---|---|
Les types de données alignés ne sont pas pris en charge dans le code managé |
Le CLR doit être en mesure d'allouer autant de données que nécessaire, ce qui peut ne pas être possible si les données sont alignées avec les déclarations telles que __m128 ou aligner. |
Les fonctions utilisant "__ImageBase" ne sont pas prises en charge dans le code managé |
__ImageBase est un symbole d'éditeur de liens spécial utilisé en général uniquement par le code natif de bas niveau pour charger une DLL. |
Les varargs ne sont pas prises en charge par l'option '/clr' du compilateur |
Les fonctions natives ne peuvent pas appeler les fonctions managées qui ont des listes d'arguments variables (varargs) parce que les fonctions ont des spécifications de disposition en pile différentes. Toutefois, si vous spécifiez l'option /clr:pure du compilateur, les listes d'arguments variables sont prises en charge parce que l'assembly peut contenir uniquement des fonctions gérées. Pour plus d'informations, consultez Code pur et vérifiable. |
Le CLR 64 bits ne prend pas en charge les données déclarées avec le modificateur __ptr32 |
Un pointeur doit être de la même taille qu'un pointeur natif sur la plateforme actuelle. Pour plus d'informations, consultez __ptr32, __ptr64. |
Le CLR 32 bits ne prend pas en charge les données déclarées avec le modificateur __ptr64 |
Un pointeur doit être de la même taille qu'un pointeur natif sur la plateforme actuelle. Pour plus d'informations, consultez __ptr32, __ptr64. |
Un ou plusieurs intrinsèques ne sont pas pris en charge dans le code managé |
Le nom de l'intrinsèque n'est pas disponible au moment où le message est émis. Toutefois, un intrinsèque qui déclenche ce message représente en général une instruction machine de bas niveau. |
L'assembly natif inline ("__asm") n'est pas pris en charge dans le code managé |
Le code assembleur inline peut contenir du code natif arbitraire qui ne peut pas être géré. |
Un thunk de fonction virtuelle de non-__clrcall doit être compilé comme natif |
Un thunk de fonction virtuelle non-__clrcall doit utiliser une adresse non managée. |
Une fonction utilisant '_setjmp' doit être compilée comme native |
Le CLR doit être en mesure de contrôler l'exécution du programme. Toutefois, la fonction setjmp contourne l'exécution normale du programme en enregistrant et restaurant des informations de bas niveau telles que les registres et l'état d'exécution. |
Exemple
L'exemple suivant génère l'erreur 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'exemple suivant génère l'erreur 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