编译器错误 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
};