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

Mar*_*tin 0 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));
...

}
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 7

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

void function1() {
    do_something;
    // <-- I want to start here
    do_something_else;
}
Run Code Online (Sandbox Code Playgroud)

进入:

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

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

void function2() {
    do_something_else;
}
Run Code Online (Sandbox Code Playgroud)

如果你只想做function1的第二部分,则调用function2().

你可以改写这样的函数:

void function1(bool do_the_first_bit) {
    if (do_the_first_bit) {
        do_something;
    }
    do_something_else;
 }
Run Code Online (Sandbox Code Playgroud)

编辑:

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

void function1() {
    load();
    while (blah) {
        do_stuff;
    }
}
Run Code Online (Sandbox Code Playgroud)

进入这个:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后当你想要做循环而不是负载时,调用function2().

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

另一种选择是:

void play() {
    static bool loaded = false;
    if (!loaded) {
        load();
        loaded = true;
    }
    do_the_other_stuff;
}
Run Code Online (Sandbox Code Playgroud)

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

在旁边:

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