C ++从程序的一部分转到另一部分

时间:2011-04-30 11:52:20

标签: c++ function

所以这是我的问题。我有一个有11个功能的程序。我想从另一个函数调用一个函数,但我希望该函数从中间的某个地方执行?有什么建议怎么办? goto功能是一个非常坏的习惯,所以我不想使用它。

编辑: 我首先使用load()初始化变量,然后在while循环中使用它们。我想要的是当我调用包含while循环的函数从内部启动而不是初始化变量时。抱歉我的英语不好。

void play()
{
load();
    while (!key[KEY_ESC])
    {

        two();

        clear_keybuf();
        acquire_screen();

        clear_to_color(screen,makecol(0,0,0));


        line( screen, 3, 0, 3, 600, makecol( 255, 255, 255));
        line( screen, 797, 0, 797, 600, makecol( 255, 255, 255));
...

}
}

2 个答案:

答案 0 :(得分:7)

无法从您调用的函数中间的某个位置执行。函数可以调用的东西,因此函数的开始是调用可以从中开始执行的位置。改变这个:

void function1() {
    do_something;
    // <-- I want to start here
    do_something_else;
}

进入这个:

void function2(); // declaration - or just put function2 first

void function1() {
    do_something;
    function2();
}

void function2() {
    do_something_else;
}

如果你只想做function1的第二部分,那就调用function2()。

您可以改为编写如下函数:

void function1(bool do_the_first_bit) {
    if (do_the_first_bit) {
        do_something;
    }
    do_something_else;
 }

编辑:

在您的示例中,您想要在循环内部启动,请更改此:

void function1() {
    load();
    while (blah) {
        do_stuff;
    }
}

进入这个:

void function2() {
    // this avoids the test first time, so as to "start in the loop"
    do {
        do_stuff;
    } while (blah);
}

void function1() {
    load();
    if (blah) {
        function2();
    }
}

然后,当您想要执行循环而不是加载时,请调用function2()

如果可能的话,应该避免在两个函数中重复“blah” - 我不清楚“在循环中启动”是否意味着,“即使循环条件为假,无论如何都要运行循环” ,但我已经解释了这一点,因为它更难。

另一种选择是:

void play() {
    static bool loaded = false;
    if (!loaded) {
        load();
        loaded = true;
    }
    do_the_other_stuff;
}

这将在第一次调用时加载,而不会在后续调用中加载。当然,它不是线程安全的,这可能是一个问题:对于线程安全的初始化,请查找pthread_onceequivalent

除了:

有些语言(但不是C ++)有一个叫做“共同例程”的概念,大概说的是一个可以从中间的某个地方返回并“记住”它从哪里返回的函数,这样下次它就是叫它从同一个地方恢复。这种行为可以在C或C ++ http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html中进行陪审团操作,但当然不建议这样做,作为为每个“事物”定义一个函数的替代方法。协同程序对于“拾起你离开的地方”非常有用,而不是“只执行功能的选定部分”。

答案 1 :(得分:1)

你的问题不是很清楚,特别是“在中间的某个地方执行”部分。但是,如果你的情况是这样的:

void func1()
{
    func2();
}

void func2()
{
    // Do something;
}

因此func2在func1下声明,你可以这样做:

void func2();

void func1()
{
    func2();
}

void func2()
{
    // Do something;
}