函数内部使用静态变量

时间:2010-12-20 18:51:53

标签: c design-patterns variables static

我多年来一直在编写C代码,但最近我遇到了一个我从未使用过的功能:函数内部的静态变量。因此,我想知道您使用此功能的方法是什么,这是正确的设计决策。

E.g。

int count(){
    static int n;
    n = n + 1;
    return n;
}

是一个不好的设计决定。为什么?因为以后你可能想要减少计数,这将涉及改变函数参数,改变所有调用代码,......

希望这很清楚, 谢谢!

4 个答案:

答案 0 :(得分:4)

void first_call()
{
   static int n = 0;

   if(!n) {
     /* do stuff here only on first call */
     n++;
   }

   /* other stuff here */
}

答案 1 :(得分:2)

我在测试代码中使用了静态变量来进行状态的延迟初始化。在生产代码中使用静态局部变量充满了危险并且可能导致细微的错误。看起来(至少在我通常使用的代码中),几乎所有以单线程开始的代码块的代码都有一种讨厌的习惯,最终最终会在并发情况下工作。在并发环境中使用静态变量可能会导致难以调试的问题。这是因为产生的状态变化本质上是隐藏的副作用。

答案 2 :(得分:0)

我使用静态变量来控制另一个线程的执行。

例如,线程#1(主线程)首先声明并初始化控制变量,例如:

/* on thread #1 */
static bool run_thread = true;
// then initialize the worker thread

然后它开始执行线程#2,这将会做一些工作,直到线程#1决定停止它:

/* thread #2 */
while (run_thread)
{
  // work until thread #1 stops me
}

答案 3 :(得分:0)

有一个突出的例子,你非常需要static来保护关键部分,即互斥锁。作为POSIX线程的一个例子:

static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mut);
/* critical code comes here */
pthread_mutex_unlock(&mut);

这不适用于auto变量。

POSIX对互斥锁,条件和一次变量都有static个初始值。