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