gpt4 book ai didi

c++ - gcc 指定任何软件异常的命令行选项可能会保留使用 'throw()' 声明的函数

转载 作者:行者123 更新时间:2023-11-30 04:30:58 25 4
gpt4 key购买 nike

我正在使用 c++ 中的 gcc 编写程序。十二月。第五,由于一个奇怪的问题(https://stackoverflow.com/a/8392854/837803),我发布了一个问题。当软件异常导致函数声明时没有像这样的“抛出”规范:

int foo();

或者这个:

int foo() throw();

gcc 生成的代码会崩溃。

我想告诉 gcc,任何类型的软件异常都可能会留下我编写的任何函数。我认为它类似于:

int foo() throw(...);

但是:我不想在所有函数规范中都写 throw(...) 。我意识到我的程序大小会更大,但这对这种情况来说不是问题。另外,我读到我建议的 gcc 行为是违反 ANSI 的。但这也没有问题。

在gcc的许许多多许许多多的命令行选项中,一定有一个是我要找的,但我还没有找到。

我正在寻找的选项是什么?

最佳答案

我不同意这一点:

gcc-generated code will crash.

这完全是错误

这样声明的函数:

 void func1();

如果你抛出一个异常,它会导致堆栈展开到一个适当的捕获。如果没有合适的 catch 程序退出(在这种情况下堆栈展开是实现定义的(因此将 catch all 放在 main 中))。

这样声明的函数:

void func2() throw(); // ie no throw.

如果异常从该函数中逃逸,则调用 unexpected()。 unexpected 的默认操作是调用 abort() 导致程序退出(注意:您可以用用户定义的函数替换 unexpected 但它必须退出或抛出一个可以通过 throw 规范的替代异常(在这种情况下那是不可能的))。

您想要的行为是默认行为(没有抛出规范)。 throw 规范是一项失败的实验,因此已被弃用。无论如何你都不应该使用它们(除了不抛出)。

因此,如果您这样定义函数,您可以获得正常工作的代码,但有异常:

void func3(); // Exceptions work fine.

但是最好在main()中放一个catch

int main()
{
try
{
// DoWork
}
catch(std::exception const& e) // We can print a good error message with these
{
log(e.what());
throw; // Not much you can do so re-throw for the OS.
}
catch(...) // Catch all other exceptions.
{
log("Unknown Exception");
throw; // Not much you can do so re-throw for the OS.
}
// Catching forces the stack to unwind all the way to main()
// Otherwise it is implementation defined whether it unwinds.
}

关于c++ - gcc 指定任何软件异常的命令行选项可能会保留使用 'throw()' 声明的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8412222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com