在C中是否有一种方法可以实现:如果以前没有在代码的前一部分中调用过函数,则调用它;否则,如果没有在以前调用过该函数,则不要调用它?
这里有一些代码:
while (function hasn't been called)
{
// do some code
}
else (call the function)
{
// do something else
}
类似的东西吗?
答案 0 :(得分:6)
嗯,这很容易。只需使用静态变量即可。
void foo() {
static int hasBeenCalled = 0;
if(!hasBeenCalled) {
/* Do stuff */
hasBeenCalled = 1;
}
}
您不必对全局变量和静态变量进行初始化,因为它们的默认值为0,而局部变量则没有。但是恕我直言,它看起来更好。全局变量和静态变量很少使用,以至于我看不到使用此“功能”的意义。
从技术上讲,您仍在使用上述方法调用该函数。如果存在问题,则可以使用全局变量,然后将我使用的逻辑放在外面。这是一个工作示例:
int hasBeenCalled = 0;
void foo() {
while(!hasBeenCalled) {
/* Do stuff that eventually calls bar() */
}
}
void bar() {
hasBeenCalled=1;
/* Do stuff */
}
int main() {
foo();
}
答案 1 :(得分:0)
不幸的是,您用来说明意图的代码不是很清楚。但是,您确实问过:
...如果在代码的前面没有调用过函数,则调用它,否则,如果没有调用过该函数,则不要调用它?
除了使用布尔值之外,您还可以使用函数指针。函数指针指向在第一次调用该函数时应调用的函数。然后,此函数将函数指针更改为指向在第一次之后应调用的函数。
static void foo_first_time(void);
static void foo_after_first_time(void);
void (*foo)(void) = foo_first_time;
static void foo_first_time(void) {
foo = foo_after_first_time;
// do some code
// ...
}
static void foo_after_first_time(void) {
// do something else
// ...
}
现在,调用方只需正常调用foo()
。第一次将调用foo_first_time
,但随后的调用将调用foo_after_first_time
。
int main () {
foo(); // calls foo_first_time
foo(); // calls foo_after_first_time
foo(); // calls foo_after_first_time again
}