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

转自:https://msdn.microsoft.com/zh-cn/library/dby9t00y/html


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

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

当指定 /clr:pure 编译器选项时,这是 1 级警告。

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

原因消息

备注

托管代码中不支持对齐数据类型

CLR 必须能够根据需要分配数据,如果数据与 __m128 或 align 等声明对齐,则 CLR 可能无法分配数据。

托管代码中不支持使用“__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
   }
}
警告 C4793:“f”: 函数编译为本机代码:
        使用“_setjmp”的函数必须编译为本机

阅读更多
文章标签: 编译器 托管代码
个人分类: C++
上一篇.Net使用非托管程序
下一篇Socket通信原理探讨(C++为例)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭