我只是在查找 gcc 的功能属性(http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html)并遇到了该returns_twice
属性。
而且我完全不知道在什么情况下函数可以返回两次......我快速查找了提到的内容vfork()
,setjmp()
但继续不知道适用场景的外观 - 你们中的任何人都使用过它或可以解释一下吗?
我只是在查找 gcc 的功能属性(http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html)并遇到了该returns_twice
属性。
而且我完全不知道在什么情况下函数可以返回两次......我快速查找了提到的内容vfork()
,setjmp()
但继续不知道适用场景的外观 - 你们中的任何人都使用过它或可以解释一下吗?
该setjmp
功能类似于创建标签(在goto
某种意义上),因此您将首先从setjmp
设置标签时返回,然后每次实际跳转到它时。
如果它看起来很奇怪,请放心,您不应该setjmp
在日常编程中使用。或者实际上......你可能根本不应该使用它。这是一个非常低级的命令,它破坏了预期的执行流程(很像goto
),尤其是在 C++ 中,它会破坏您可以预期的大多数不变量。
当您调用 时setjmp
,它会将其确定为返回点,然后在setjmp
调用之后的代码处继续执行。
在代码稍后的某个时间点,调用longjmp
(使用由先前调用初始化的跳转缓冲区setjmp
)返回执行以再次从同一点开始(即紧跟在调用之后的代码setjmp
)。
因此,最初的调用正常返回,然后在以后的任意时间,执行再次返回(或至少可能返回)到同一点。
该属性只是警告编译器该事实。