Partager via


Avertissement du compilateur (niveaux 1 et 3) C4793

'function' : la fonction est compilée en tant que code natif : 'reason'

Notes

Le compilateur ne peut pas compiler la fonction en code managé, même si l’option du compilateur /clr est spécifiée. Au lieu de cela, le compilateur émet un avertissement C4793 et un message de continuation explicatif, puis compile la fonction en code natif. Le message de continuation contient le texte de raison qui explique pourquoi la fonction ne peut pas être compilée sur MSIL.

Il s’agit d’un avertissement de niveau 1 lorsque vous spécifiez l’option du compilateur /clr :pure . L’option /clr :pure compiler est déconseillée dans Visual Studio 2015 et non prise en charge dans Visual Studio 2017.

Le tableau suivant répertorie tous les messages de continuation possibles.

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 des données selon les besoins, ce qui peut ne pas être possible si les données sont alignées avec des déclarations telles que __m128 ou aligner.
Les fonctions qui utilisent « __ImageBase » ne sont pas prises en charge dans le code managé __ImageBase est un symbole d’éditeur de liens spécial qui est généralement utilisé uniquement par du code natif de bas niveau pour charger une DLL.
varargs ne sont pas pris en charge par l’option du compilateur '/clr' Les fonctions natives ne peuvent pas appeler des fonctions managées qui ont des listes d’arguments variables (varargs), car les fonctions ont des exigences de disposition de pile différentes. Toutefois, si vous spécifiez l’option du compilateur /clr :pure , les listes d’arguments variables sont prises en charge, car l’assembly ne peut contenir que des fonctions managées. Pour plus d’informations, consultez Code vérifiable et pur (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 élément intrinsèque qui provoque ce message représente généralement une instruction de machine de bas niveau.
L’assembly natif inline ('__asm') n’est pas pris en charge dans le code managé Le code d’assembly inline peut contenir du code natif arbitraire, qui ne peut pas être géré.
Un thunk de fonction virtuelle 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 en tant que native Le CLR doit être en mesure de contrôler l’exécution du programme. Toutefois, la fonction setjmp contourne l’exécution régulière du programme en enregistrant et en 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