共用方式為


編譯器警告 (層級 1 和 3) C4793

' function ' : 函式會編譯為機器碼: ' reason '

備註

即使 已指定 /clr 編譯器選項,編譯器也無法將函 式編譯 成 Managed 程式碼。 相反地,編譯器會發出警告 C4793 和說明性接續訊息,然後將函 式編譯成機器碼。 接續訊息包含 原因文字,說明為什麼 函式無法編譯為 MSIL

當您指定 /clr:pure 編譯器選項時,這是層級 1 警告。 Visual Studio 2015 中已淘汰 /clr:pure 編譯器選項,Visual Studio 2017 不支援。

下表列出所有可能的接續訊息。

原因訊息 備註
Managed 程式碼不支援對齊的資料類型 CLR 必須能夠視需要配置資料,如果資料與__m128 對齊 等 宣告一致,則可能無法。
Managed 程式碼不支援使用 '__ImageBase' 的函式 __ImageBase 是特殊的連結器符號,通常只能由低階原生程式碼用來載入 DLL。
'/clr' 編譯器選項不支援 varargs 原生函式無法呼叫具有 變數引數清單 (varargs) 的 Managed 函式,因為函式有不同的堆疊配置需求。 不過,如果您指定 /clr:pure 編譯器選項,則支援變數引數清單,因為元件只能包含 Managed 函式。 如需詳細資訊,請參閱 純和可驗證的程式碼(C++/CLI)。
64 位 CLR 不支援使用 __ptr32 修飾詞宣告的資料 指標的大小必須與目前平臺上的原生指標相同。 如需詳細資訊,請參閱 __ptr32、__ptr64
32 位 CLR 不支援使用 __ptr64 修飾詞宣告的資料 指標的大小必須與目前平臺上的原生指標相同。 如需詳細資訊,請參閱 __ptr32、__ptr64
Managed 程式碼不支援一或多個內建函式 發出訊息時無法使用內建函式的名稱。 不過,造成此訊息的內建通常代表低階機器指令。
Managed 程式碼不支援內嵌原生元件 ('__asm') 內嵌元件程式碼 可以包含無法管理的任意機器碼。
非__clrcall虛擬函式 Thunk 必須編譯為原生 __clrcall虛擬函式 Thunk 必須使用 Unmanaged 位址。
使用 '_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