編譯器錯誤 C2712
無法在需要物件回溯的函式中使用
__try
備註
如果您使用 /EHsc
時,可能會發生錯誤 C2712,且具有結構化例外狀況處理的函式也有需要回溯的物件(解構)。
可能的解決方案:
將需要 SEH 的程式碼移至另一個函式
重寫使用 SEH 的函式,以避免使用具有解構函式的本機變數和參數。 請勿在建構函式或解構函式中使用 SEH
編譯時不要使用 /EHsc
如果您使用 關鍵詞呼叫宣告 __event
的方法,也可能會發生錯誤 C2712。 因為事件可能會在多線程環境中使用,編譯程式會產生程序代碼,以防止操作基礎事件對象,然後將產生的程式碼括在 SEH try-finally
語句中。 因此,如果您呼叫事件方法,並以類型具有解構函式的引數傳值,就會發生錯誤 C2712。 此情況下的解決方案之一,是傳遞引數做為常數參考。
如果您使用 編譯 /clr:pure
,並在區塊中 __try
宣告指針對函式的靜態陣列,也可能會發生 C2712。 靜態成員需要編譯程式使用 下的 /clr:pure
動態初始化,這表示C++例外狀況處理。 然而,在 __try
區塊中不允許執行 C++ 例外狀況處理。
/clr:pure
和 /clr:safe
編譯器選項在 Visual Studio 2015 中已淘汰,且 Visual Studio 2017 已不支援此選項。
範例
下列範例會產生 C2712,並說明如何加以修正。
// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
static int smf();
void fnc();
};
void S1::fnc() {
__try {
static int (*array_1[])() = {smf,}; // C2712
// OK
static int (*array_2[2])();
array_2[0] = smf;
}
__except(0) {}
}