c中的静态变量

Ash*_*ban 8 c static

嗨,我正在为我的C考试而学习,我遇到了一个我无法想出答案的问题.

程序员编写了一个程序来计算用户数(Count.h,Count.c):

/******** FILE: Counter.h ***********/
static int counter = 0;
int getUsersNum ();
/******** END OF FILE: Counter.h ****/

/******** FILE: Counter.c ***********/
#include "Counter.h"
int getUsersNum ()
{
    return counter;
}
/******** END OF FILE: Counter.c ****/
Run Code Online (Sandbox Code Playgroud)

还有一个测试人员来测试它:

/******** FILE: CounterMain.c ***********/
#include "Counter.h"
#include <stdio.h>
int main ()
{
    int i;
    for (i=0;i<5;++i)
    {
        ++counter;
        printf ("Users num:  %d\n", getUsersNum());
    }
    return 0;
}
/******** END OF FILE: CounterMain.c ****/
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,产出是:

Users num: 0
Users num: 0
Users num: 0
Users num: 0
Users num: 0
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这个静态变量的使用计数器没有提前..为什么他们得到这样的输入?

谢谢你们!

Ree*_*sey 14

在C中,静态变量的范围是其定义的源文件.

由于您将此标头加载到2个单独的.c文件中,因此每个文件都会获得一个唯一的变量.在一个文件中增加"计数器"不会影响另一个文件中的"静态"变量.

有关详细信息,请参阅此说明.为了使变量在多个文件中可见并共享,需要将其声明为extern.除此以外:

静态全局变量:在源文件的顶层(在任何函数定义之外)声明为static的变量在整个文件中都是可见的("文件范围").

这是哪种情况.

  • "源文件"令人困惑,因为头文件是源文件,并且该变量仅在一个源文件中声明._Translation unit_会更准确. (4认同)
  • `在C中,静态变量的范围是其定义的源文件`.您可能希望将`source file`替换为`translation unit`. (2认同)

pmg*_*pmg 12

只需将其视为".h文件不存在".会发生什么是.h文件包含在.c文件中,只有.c文件被编译(并链接(混合)在一起).

在你的情况下,你有2个.c文件

static int counter = 0;
Run Code Online (Sandbox Code Playgroud)

每个counter都特定于它所在的.c文件counter.CounterMain.c中的变量与counterCounter.c中的变量不同.

您需要有一个单一的计数器定义.你可以有几个声明(通常在.h文件中)

/* .h file */
extern int counter;

/* .c file(s) that use the counter but don't define it */
#include "file.h"

/* .c file that **defines** counter */
#include "file.h"
int counter = 0;
Run Code Online (Sandbox Code Playgroud)

Ohhhhhhhhhhhhhhhhhhh,就是那static件事.不要在全球范围内使用它!

  • +1用于发布简单的解释和解决方案,而不是通过大量准确但有血腥的细节. (2认同)