编译器错误 C3068

“function”:“naked”函数不能包含如果出现 C++ 异常则会要求回退的对象

编译器无法对引发异常的函数执行堆栈展开,因为函数中创建了临时对象,并且指定了 C++ 异常处理 (/EHsc)。

若要解决此错误,请执行以下操作之一:

  • 不要使用 /EHsc 进行编译。

  • 请勿将函数标记为 naked

  • 请勿在函数中创建临时对象。

如果函数在堆栈上创建临时对象,如果函数引发异常,并且如果启用了 C++ 异常处理,则编译器将在引发异常时清理堆栈。

引发异常时,将针对函数执行编译器生成的代码(称为 prolog 和 epilog),而该代码不存在于裸函数中。

示例

以下示例生成 C3068:

// C3068.cpp
// compile with: /EHsc
// processor: x86
class A {
public:
   A(){}
   ~A(){}
};

void b(A){}

__declspec(naked) void c() {
   b(A());   // C3068
};