从静态链接的C++库中抛出异常是不安全的?

Oys*_*ein 5 c++ static exception

我听说在C++库中抛出异常可能是有危险的,特别是对于DLL,特别是如果调用代码和库是用不同的编译器编译的.有没有道理呢?只要我坚持使用静态库,它是否安全?请注意,我不是只讨论库中异常的内部使用,我想将它们深入到调用代码中:)

只是为了澄清:假设我有一个编译的静态库,它定义了类Foo:

class Foo
{
public:
    // Constructor
    Foo()
    {
        /* ... Do stuff ... */        
        if (stuffwentwrong)
            throw(123); // We throw an integer error code (to make it simple) 
    }
};
Run Code Online (Sandbox Code Playgroud)

有些人像这样使用它:

try 
{
    Foo foo_object;
}
catch (int i)
{
    std::cout << "Oh bum. Code: " << i; 
}
Run Code Online (Sandbox Code Playgroud)

那会安全吗?

Art*_*yom 2

特别是如果调用代码和库是使用不同的编译器编译的

通常不能混合使用不具有兼容 ABI 的不同 C++ 编译器。因此,例如,您不能从使用 MSVC 编译的库中抛出异常并尝试使用 GCC 捕获它。

但除此之外,通常不会有任何问题。

小记:

MSVC 有几个不兼容的异常模型,不要混合使用。