Avertissement du compilateur (niveaux 1 et 3) C4793

'fonction' : la fonction est compilée comme code natif : 'raison'

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 (C++/CLI).

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
   }
}
  

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
}