1. static关键字修饰后的变量和函数由非静态变成了静态变量和静态函数,由全局变成了局部;
2. static影响变量和函数的作用域(全局可见性)和存储位置(栈或静态存储区--生命周期)
static存储位置:
无论是全局变量还是局部变量(函数内部的静态局部变量))static变量都存储在全局/静态区域,在编译期就为其分配内存, 默认初始化为0,并不会因为函数的退出而释放空间,只有在程序结束时释放。
(static生命周期=程序的生命周期)
static作用域:
static变量和函数的作用域被限制在本文件内,只有本文件内的代码才能访问它,在其它文件中不可见,所以在其它文件中可以定义相同名字的变量和函数,不会发生冲突。
所有未加static前缀的非静态全局变量和函数都具有全局可见性,其它的源文件也能访问,用extern声明,并包含H头文件即可。
多个文件公用一个全局变量,在H头文件用extern只声明一次:
//test.h
#ifndef __TEST_H
#define __TEST_H
extern char g_str[100]; // 声明全局变量g_str
extern char a; // 声明全局变量a
void fun1(); // 声明全局函数fun1
#endif
//test.c
char g_str[100]; // 定义全局变量g_str
char a=5; // 定义全局变量a
void fun1() // 定义全局函数fun1
{
printf("a=%d\n", a);
}
//main.c
#include "test.h" //只需包含头文件即可,不用再次声明就可直接使用
Void main()
{
a=5;
fun1();
}
多个文件公用一个全局变量,每个文件都要用extern声明一次:
//test.h
#ifndef __TEST_H
#define __TEST_H
//extern char g_str[100]; // 声明全局变量g_str
//extern char a; // 声明全局变量a
void fun1(); // 声明全局函数fun1
#endif
//test.c
char g_str[100]; // 定义全局变量g_str
char a=5; // 定义全局变量a
void fun1() // 定义全局函数fun1
{
printf("a=%d\n", a);
}
//多个文件公用一个全局变量,每个文件都要用extern声明一次:
//main.c
#include "test.h"
extern char g_str[];// extern variable must be declared before use
extern char a; // 每个用到全局变量的文件都要声明一次
Void main()
{
a=5;
fun1();
}
要想在其它文件使用全局变量,必须包含对应头文件H,否则报错。
//test.h
#ifndef __TEST_H
#define __TEST_H
//extern char g_str[100]; // 声明全局变量g_str
//extern char a; // 声明全局变量a
//void fun1(); // 声明全局函数fun1
#endif
//test.c
char g_str[100]; // 定义全局变量g_str (其它文件可见)
char a=5; // 定义全局变量a (其它文件可见)
void fun1() // 定义全局函数fun1 (其它文件可见)
{
printf("a=%d\n", a);
}
//所以,要想在其它文件使用全局变量,必须包含对应头文件H。
//main.c
//#include "test.h" //未包含头文件
extern char g_str[];
extern char a;
Void main()
{
a=5; //如果未包含头文件,对于变量,无论是否用extern声明,都会报错
fun1(); //如果未包含头文件,对于函数,无论是否用extern声明,都不会报错,而是警告
}
C文件中用static声明变量,无法调用其它文件的静态全局变量,否则报错!,如下代码:
//test.h
#ifndef __TEST_H
#define __TEST_H
#endif
//test.c
static char g_str[100]; // 定义静态全局变量g_str (对外不可见)
static char a=5; // 定义静态全局变量a (对外不可见)
static void fun1() // 定义静态全局函数fun1 (对外不可见)
{
printf("a=%d\n", a);
}
//无法调用其它文件的静态全局变量和静态全局函数,否则报错!
//main.c
#include "test.h"
extern char a;
Void main()
{
a=5; //Error: Undefined symbol a (referred from main.o).
fun1(); //Error: Undefined symbol fun1 (referred from main.o).
}
头文件中用static声明变量:
//1.头文件中用static声明变量,那么包含此头文件的每一个文件都会创建一个名称相同的变量,
//彼此独立,互不影响,初始值相同!对于没有包含的文件来说依然不可见。
//2.表面上在不同文件操作相同名称的变量,好像是操作同一个变量,实际是不同的变量!
//3.所以,一般定义static全局变量时,都把它放在原文件中而不是头文件
//test.h
#ifndef __TEST_H
#define __TEST_H
static char g_str[100]; // 声明静态全局变量g_str (对外不可见)
static char a=5; // 声明静态全局变量a (对外不可见)
void fun1();
#endif
//test.c
void fun1() // 定义非静态全局函数fun1 (对外可见)
{
printf("a=%d\n", a);
}
//无法调用其它文件的静态全局变量,否则报错!
//main.c
#include "test.h"
Void main()
{
a=5; //正确!
fun1(); //正确!
}