静态变量

时间:2010-12-02 17:22:13

标签: c

任何人都可以解释何时应该使用静态变量以及为什么?

4 个答案:

答案 0 :(得分:8)

C中有static个关键字的两种不同用法:

  • 函数范围内的静态声明
  • 函数范围之外的静态声明

(MOSTLY)EVIL:函数中的静态变量

函数中的静态变量用作“内存”状态。

基本上,您的变量仅在您第一次调用时初始化为默认值,然后在以后的所有调用中保留其先前的值。

如果你需要记住这种状态,这可能是有用的,但是这种静态的使用通常是不赞成,因为它们几乎是伪装的全局变量:它们会消耗你的记忆,直到你的过程结束一次。

因此,一般,使本地化的功能 EVIL / BAD

示例:

#include <stdio.h>


void  ping() {
  static int counter = 0;

  return (++counter);
}

int   main(int ac, char **av) {
  print("%d\n", ping()); // outputs 1
  print("%d\n", ping()); // outputs 2
  return (0);
}

<强>输出:

1
2

(MOSTLY)GOOD:函数范围之外的静态变量

你可以在变量或函数上使用函数外部的静态(毕竟,它也是一个变量,并指向一个内存地址)。

它的作用是将该变量的使用限制在包含它的文件中。你不能从别的地方打电话。虽然它仍然意味着函数/ var是“全局的”,因为它会在程序终止之前消耗你的内存,至少它具有不污染你的“命名空间”的风格。

这很有趣,因为这样您可以在项目的不同文件中使用具有相同名称的小实用程序函数。

所以,一般,使本地化的功能 GOOD

示例:

example.h文件

#ifndef __EXAMPLE_H__
# define __EXAMPLE_H__

void  function_in_other_file(void);

#endif

file1.c中

#include <stdio.h>

#include "example.h"

static void  test(void);


void test(void) {
  printf("file1.c: test()\n");
}

int   main(int ac, char **av) {
  test();  // calls the test function declared above (prints "file1.c: test()")
  function_in_other_file();
  return (0);
}

file2.c中

#include <stdio.h>

#include "example.h"

static void  test(void); // that's a different test!!


void test(void) {
  printf("file2.c: test()\n");
}

void   function_in_other_file(void) {
  test();  // prints file2.c: test()
  return (0);
}

<强>输出:

file1.c: test()
file2.c: test()

PS :如果你是纯粹主义者,不要向我扔石头:我知道静态变量不是邪恶的,它们并不完全是全局变量,函数不是变量,并且在C中没有实际的“命名空间”(不要开始使用符号)但是这是为了解释。

资源

答案 1 :(得分:2)

在C static中意味着两件事,实际上是:

1)在函数内部,它意味着函数退出后static变量将保持存在

2)否则意味着static变量或函数对于该编译单元(“文件”)是本地的,即不是外部可见的

答案 2 :(得分:2)

http://en.wikipedia.org/wiki/Static_variable

在C中,在函数外部声明为static的变量将无法从该文件外部访问(不能在另一个文件中使用extern ..)

对于函数中的局部变量,static将在程序执行期间使变量的生命周期持续,而不仅仅是在堆栈上分配的变量。

使用静态变量时,它确实会引发多线程问题,因为只存在一个变量实例 - 因此需要牢记这一点。

答案 3 :(得分:0)

取决于你所谈论的范围。

函数内部,类定义内部或全局变量前面的静态?

在函数中,当您需要阻止变量重新初始化时,这是很好的。低于次数将是10.

  for(int z=0; z<10; z++)
  {
    static int number_of_times = 0;
    number_of_times++;
  }

另一个用途是当我们需要保留有关函数返回的最后一个值的信息时。

如果要对类的实例进行编号,可以使用静态成员变量来跟踪它们

然后,静态成员函数可用于修改静态成员变量以跟踪其值

代码文件中的全局静态变量指示属于项目一部分的其他文件无法访问该变量。只有文件中的代码才可以。 (模拟面向对象的代码)