編譯器警告 (層級 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
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應