8

我只是在查找 gcc 的功能属性(http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html)并遇到了该returns_twice属性。

而且我完全不知道在什么情况下函数可以返回两次......我快速查找了提到的内容vfork()setjmp()但继续不知道适用场景的外观 - 你们中的任何人都使用过它或可以解释一下吗?

4

2 回答 2

7

setjmp功能类似于创建标签(在goto某种意义上),因此您将首先从setjmp设置标签时返回,然后每次实际跳转到它时。

如果它看起来很奇怪,请放心,您不应该setjmp在日常编程中使用。或者实际上......你可能根本不应该使用它。这是一个非常低级的命令,它破坏了预期的执行流程(很像goto),尤其是在 C++ 中,它会破坏您可以预期的大多数不变量。

于 2013-07-29T06:59:19.253 回答
3

当您调用 时setjmp,它会将其确定为返回点,然后在setjmp调用之后的代码处继续执行。

在代码稍后的某个时间点,调用longjmp(使用由先前调用初始化的跳转缓冲区setjmp)返回执行以再次从同一点开始(即紧跟在调用之后的代码setjmp)。

因此,最初的调用正常返回,然后在以后的任意时间,执行再次返回(或至少可能返回)到同一点。

该属性只是警告编译器该事实。

于 2013-07-29T07:01:03.477 回答