编译器警告(等级 1 和等级 3)C4793

“function”:函数编译为本机代码:“reason”

备注

即使已指定 /clr 编译器选项,编译器也无法将 function 编译为托管代码。 相反,编译器将发出警告 C4793 和说明性的连续消息,然后将 function 编译为本机代码。 连续消息包含 reason 文本,用来解释不能将 function 编译为 MSIL 的原因

指定 /clr:pure 编译器选项时,这是 1 级警告。 “/clr:pure”编译器选项在 Visual Studio 2015 中已弃用,在 Visual Studio 2017 中不受支持

下表列出了所有可能的延续消息。

原因消息 注解
托管代码中不支持对齐数据类型 CLR 必须能够按需分配数据,如果数据与 __m128align 等声明对齐,则可能无法实现这一点。
托管代码不支持使用“__ImageBase”的函数 __ImageBase 是一个特殊的链接器符号,通常仅由低级本机代码用于加载 DLL。
“/clr”编译器选项不支持 varargs 本机函数无法调用具有可变参数列表 (varargs) 的托管函数,因为这些函数具有不同的堆栈布局要求。 但是,如果指定 /clr:pure 编译器选项,则支持变量自变量列表,因为程序集只能包含托管函数。 有关详细信息,请参阅纯代码和可验证代码 (C++/CLI)
64 位 CLR 不支持使用 __ptr32 修饰符声明的数据 指针的大小必须与当前平台上的本机指针大小相同。 有关详细信息,请参阅 __ptr32、__ptr64
32 位 CLR 不支持使用 __ptr64 修饰符声明的数据 指针的大小必须与当前平台上的本机指针大小相同。 有关详细信息,请参阅 __ptr32、__ptr64
托管代码不支持一个或多个内部函数 发出消息时,内部函数的名称不可用。 但是,导致此消息的内部函数通常表示低级计算机指令。
托管代码不支持内联本机程序集 ('__asm') 内联程序集代码可以包含无法管理的任意本机代码。
非 __clrcall 虚函数 thunk 必须编译为本机函数 __clrcall 虚函数 thunk 必须使用非托管地址。
使用“_setjmp”的函数必须编译为本机函数 CLR 必须能够控制程序执行。 但是,setjmp 函数通过保存和还原寄存器和执行状态等低级信息来绕过常规程序执行。

示例

以下示例生成 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

以下示例生成 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