編譯器警告 (層級 1 和 3) C4793
'function':函式以機器碼編譯:'reason'
編譯器無法將 function 編譯為 Managed 程式碼,即使已經指定 /clr 編譯器選項。編譯器反而會發出警告 C4793 和說明的接續訊息,然後將 function 編譯成機器碼。這個接續訊息包含的 reason 文字,會說明 function 無法編譯成 MSIL 的原因。
這是在指定 /clr:pure 編譯器選項時的層級 1 警告。
下列表格列出所有可能的接續訊息。
原因訊息 |
備註 |
---|---|
Managed 程式碼不支援對齊的資料型別 |
|
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') |
內嵌組譯程式碼可以包含任意無法 Managed 的機器碼。 |
非 __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
}
}
下列範例會產生 C4793。
// C4793_b.cpp
// compile with: /c /clr /W3
#include <setjmp.h>
jmp_buf test_buf;
void f() {
setjmp(test_buf); // C4793 warning
}