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

2021-07-01 23:57:36 字數 1448 閱讀 1628

**:

「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:「f」: 函式編譯為本機**:

使用「_setjmp」的函式必須編譯為本機

編譯器警告和錯誤詳解

原文 1.warning 550 d variable d was set but never used 描述 變數 d 定義但從未使用,或者是,雖然這個變數你使用了,但編譯器認為變數d所在的語句沒有意義,編譯器把它優化了.解決 仔細衡量所定義的變數d是否有用,若是認定變數d所在語句有意義,那麼嘗試...

keil MDK編譯器警告和錯誤詳解

1.warning 550 d variable d was set but never used 描述 變數 d 定義但從未使用,或者是,雖然這個變數你使用了,但編譯器認為變數d所在的語句沒有意義,編譯器把它優化了.解決 仔細衡量所定義的變數d是否有用,若是認定變數d所在語句有意義,那麼嘗試用vo...

keil MDK編譯器警告和錯誤詳解

1.warning 550 d variable d was set but never used 描述 變數 d 定義但從未使用,或者是,雖然這個變數你使用了,但編譯器認為變數d所在的語句沒有意義,編譯器把它優化了.解決 仔細衡量所定義的變數d是否有用,若是認定變數d所在語句有意義,那麼嘗試用vo...