如何从外部函数更改本地静态变量值

时间:2012-10-29 07:16:01

标签: c++ static local-variables

#include <stdio.h>

void func() {
   static int x = 0;  // x is initialized only once across three calls of
                      //     func()
   printf("%d\n", x); // outputs the value of x
   x = x + 1;
}

int main(int argc, char * const argv[]) {
   func(); // prints 0
   func(); // prints 1
   func(); // prints 2

   // Here I want to reinitialize x value to 0, how to do that ? <-- this line
   return 0;
}

在上面的代码中,在调用func()3次之后,我想将x重新初始化为零。有没有方法将它重新初始化为0?

3 个答案:

答案 0 :(得分:2)

您希望函数始终在三次调用后重置计数器吗?或者你想让调用者在任意时间重置计数?

如果是前者,你可以这样做:

void func() {
  static int x = 0;
  printf("%d\n", x);
  x = (x + 1) % 3;
}

如果是后者,使用本地静态变量可能是一个糟糕的选择;你可以使用以下设计:

class Func
{
  int x;
  // disable copying

public:
  Func() : x(0) {}

  void operator() {
    printf("%d\n", x);
    x = x + 1;
  }

  void reset() {
    x = 0;
  }
};

Func func;

你应该使它不可复制,以避免两个对象增加两个不同的计数器(或使它成为单例),或使计数器成为静态成员,以便每个对象递增相同的计数器。现在你像这样使用它:

int main(int argc, char * const argv[]) {
  func(); // prints 0
  func(); // prints 1
  func(); // prints 2

  func.reset();
  return 0;
}

答案 1 :(得分:0)

你做不到。它是一个局部静态变量,在func()之外是不可见的。

您可以使用:

  1. 全球静态(一般不推荐)。
  2. 通过引用/指针参数传递,或通过引用返回。

答案 2 :(得分:0)

您可以func()将变量的地址指定给从func()外部可见的指针。

或者您可以将一个特殊参数传递给func(),告诉它重置变量。

但实际上,在x内声明func()的重点是让它仅在func()的正文中可见。如果您希望能够修改x,请在其他位置定义它。既然你正在编写C ++,那么x成为某个类的静态成员可能是有意义的。