考虑以下情况:
fn(1)然后调用fn(2) fn(2)调用fn(3),现在 fn(3)应该将控制传递给fn(1)而不是fn(2),并且控制不能再返回。
关于这一点,我尝试过使用goto,但是goto在函数之间不起作用,它只是本地跳转。
我想检查是否还有其他方法可以将控件发送到另一个函数
注意:根据我的探索
,没有全局变量,在这种情况下指向函数的指针将起作用答案 0 :(得分:4)
嗯,这样做的典型方法是:
int fn3() {
return 1;
}
void fn2() {
if (fn3())
return;
...
}
不确定你是否在寻找更深奥的东西,比如setjmp / longjmp
答案 1 :(得分:2)
如果绝对必须这样做,您可以将longjmp用作“长距离转到”。
答案 2 :(得分:1)
int fn1(void) {
printf("in fn1 before calling fn2\n");
fn2();
printf("in fn1 after calling fn2\n");
return 0;
}
int fn2(void) {
printf("in fn2 before calling fn3\n");
if (1) {
return fn3();
}
printf("in fn2 after calling fn3\n");
return 0;
}
int fn3(void) {
printf("in fn3\n");
return 0;
}
答案 3 :(得分:1)
你可以使用setjmp
和longjmp
来执行此操作 - 但实际上,这几乎肯定是一个非常错误的想法。前Fortran程序员(以及其他人)有时候仍然会对你似乎打算创造的那种混乱做噩梦。鉴于一个为300多个并发用户提供服务的大型机以20 MHz左右的速度运行,当时有一些借口,即使跟踪事情是一团糟。鉴于当前的计算机,我不仅要问实用程序,还要问一个没有返回的函数调用的非常合理(特别是因为CPU现在针对这种情况进行了优化,所以你要求的将比正常返回慢)。
答案 4 :(得分:1)
您尝试实施的内容是所谓的 coroutines 。虽然C不直接支持它们,但有一些方法可以利用 Duff的设备等一些巧妙的黑客来实现它们。
Simon Tatham写了一篇关于 Coroutines in C 的优秀文章:http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
答案 5 :(得分:0)
我认为你应该使用setjmp()和longjmp()。该男子可以here。
以下示例向您展示了如何使用它(来自http://en.wikipedia.org/wiki/Setjmp.h#Example_usage):
#include <stdio.h>
#include <setjmp.h>
static jmp_buf buf;
void second(void) {
printf("second\n"); // prints
longjmp(buf,1); // jumps back to where setjmp was called - making setjmp now return 1
}
void first(void) {
second();
printf("first\n"); // does not print
}
int main() {
if ( ! setjmp(buf) ) {
first(); // when executed, setjmp returns 0
} else { // when longjmp jumps back, setjmp returns 1
printf("main\n"); // prints
}
return 0;
}
输出:
second
main