如何实现:如果尚未调用该函数,该怎么办?

时间:2019-05-01 20:29:47

标签: c function while-loop call

在C中是否有一种方法可以实现:如果以前没有在代码的前一部分中调用过函数,则调用它;否则,如果没有在以前调用过该函数,则不要调用它?

这里有一些代码:

while (function hasn't been called)
{
    // do some code
}
else (call the function)
{
    // do something else
}

类似的东西吗?

2 个答案:

答案 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
}