全局变量
在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明
全局变量的生命周期和程序运行周期一样
不同文件的全局变量不可重名
静态(static)全局变量
在函数外定义,作用范围被限制在所定义的文件中
不同文件静态全局变量可以重名,但作用域不冲突
static全局变量的生命周期和程序运行周期一样,同时staitc全局变量的值只初始化一次
void fun(int i)
{
//a只能被初始化一次,但是可以多次赋值
static int a = 10;
cout << "第" << i << "个是===="<< a++ << endl;//输出
}
int main()
{
for(int i = 0; i < 10; i++)
{
fun(i);
//cout << "第"<< i <<"个是====" << i << endl;
}
system("pause");
return EXIT_SUCCESS;
}
extern全局变量声明
extern int a;声明一个变量,这个变量在别的文件中已经定义了,这里只是声明,而不是定义。
类型 | 作用域 | 生命周期 |
auto变量 | 一对{}内 | 当前函数 |
static局部变量 | 一对{}内 | 整个程序运行期 |
extern变量 | 整个程序 | 整个程序运行期 |
static全局变量 | 当前文件 | 整个程序运行期 |
extern函数 | 整个程序 | 整个程序运行期 |
static函数 | 当前文件 | 整个程序运行期 |
register变量 | 一对{}内 | 当前函数 |
具体使用如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//extern int a = 10; 默认外部链接
int a = 10; //全局区
//静态全局变量是内部链接
static int b = 20; //静态区
//内部链接和外部链接有什么区别?
//1. 如果变量是内部链接的话,那么此变量只能在当前文件内访问
//2. 如果是变量是外部链接的话,那么此变量可以被其他文件使用
//1. 全局静态变量和局部静态变量都存储在静态区,都是在程序运行期间都是合法有效
//2. 局部静态变量符号的可见范围仅限于当前函数内部,全局静态变量可见范围从定义到文件结尾
//头文件不要放定义,只能放声明
void test01()
{
static int c = 30; //静态区
}
//头文件不参与编译,每一个.c文件,我们叫做一个编译单元
//编译器独立编译每一个.c文件
void test02()
{
//声明,表示告诉编译器这个符号是存在的,你让我先编译通过,让连接器去找到底这个符号在那
extern int g_a;
printf("g_a = %d\n", g_a);
}
int main(){
test02();
system("pause");
return EXIT_SUCCESS;
}