嗨,我正在为我的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的变量在整个文件中都是可见的("文件范围").
这是哪种情况.
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件事.不要在全球范围内使用它!