所以这是我的问题.我有一个有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)
无法从您调用的函数中间的某个位置执行.函数是可以调用的东西,因此函数的开始是调用可以从中开始执行的位置.改变这个:
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,但肯定不建议这样做作为定义一个函数的替代方法你要做的每件"事".协同程序对于"拾起你离开的地方"非常有用,而不是"仅执行功能的选定部分".