所以这是我的问题。我有一个有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));
...
}
}
答案 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_once
或equivalent。
除了:
有些语言(但不是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;
}