編譯器警告 (層級 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