一、Static在头文件中使用意味着什么?
虽然在代码中好像使用了相同的变量,但是实际上在每个源文件中都有单独的变量。所以,在头文件中定义static变量并在其它文件中引用头文件和调用该变量的过程中会造成变量多次定义,造成内存空间的浪费。这并非是真正的全局变量,应该避免使用这种定义方式。
二、验证过程
在某个头文件中定义static int a =10;
在其余的测试函数中分别调用上述静态变量,并且打印其地址;
1.测试代码
代码如下(示例):
//test.c
#include <stdio.h>
#include "test.h"
void test()
{
printf("test.c文件中static int a =%d\n", a);
printf("test.c文件中static int a的地址为:%x\n", &a);
}
在test.h头文件中写入static int a=10;
//test1.c
#include <stdio.h>
#include "test1.h"
#include "test.h"
void test1()
{
printf("test1.c文件中static int a =%d\n", a);
printf("test1.c文件中static int a的地址为:%x\n", &a);
}
//test.h
#ifndef TEST_H
#define TEST_H
static int a=10;
void test();
#endif
//test1.h
#ifndef TEST1_H
#define TEST1_H
void test1();
#endif
//main.c
#include <stdio.h>
#include "test.h"
#include "test1.h"
int main()
{
test();
test1();
return 0;
}
2.程序运行结果:
3.结果分析:
结果表明,虽然不同的测试文件中函数都得到了a=10的结果,但是打印地址发现它们并不共享内存空间,也就是说地址空间被重复申请占用了;
三、说明
在 C/C++ 中static的作用
(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
(4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。
总结
在头文件中定义static变量,在多文件使用该静态变量的过程中会造成变量多次定义,从而造成内存空间的浪费,应当避免此类写法。