C语言中函数之间的控制交换

时间:2011-03-28 14:16:12

标签: c

考虑以下情况:

fn(1)然后调用fn(2) fn(2)调用fn(3),现在 fn(3)应该将控制传递给fn(1)而不是fn(2),并且控制不能再返回。

关于这一点,我尝试过使用goto,但是goto在函数之间不起作用,它只是本地跳转。

我想检查是否还有其他方法可以将控件发送到另一个函数

注意:根据我的探索

,没有全局变量,在这种情况下指向函数的指针将起作用

6 个答案:

答案 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)

可以使用setjmplongjmp来执行此操作 - 但实际上,这几乎肯定是一个非常错误的想法。前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