为什么VC++引入非标准关键字:__leave

Why does VC++ introduce the nonstandard keyword: __leave?

本文关键字:leave 关键字 非标准 VC++ 为什么      更新时间:2023-10-16

根据MSDN:

__leave语句更有效,因为它不会导致 堆叠展开。

据我了解,也就是说:"这样常见的代码片段很危险!

struct A
{
    int* p;
    A() : p(new int) {}
    ~A() { delete p; }
};
void f()
{
    __try
    {
        A a;
        ... // Doing somthing
        if (the thing has gone bad) __leave;
        ... // Continue
    }
    __finally
    {}
}

C++项目中完全避免__leave是否是一种最佳实践?

http://msdn.microsoft.com/en-us/library/yb3kz605.aspx

说:

对于C++程序,应使用C++异常处理,而不是结构化异常处理。有关详细信息,请参阅C++语言参考中的异常处理。

编辑:此外,通常最好避免使用编译器特定的功能。

这取决于。 __try/__finally是为Win32结构化异常处理而构建的,这与C++结构化异常处理并不完全相同。 如果要编写 Win32 驱动程序,则必须使用 Win32 SEH。 如果没有,我会坚持C++ EH。