1. static和extern对函数的作用
外部函数:定义的函数能被本文件和其他文件访问
1> 默认情况下所有函数都是外部函数
2> 不允许有同名的外部函数
内部函数:定义的函数只能被本文件访问,其他文件不能访问
1> 允许不同文件中有同名的内部函数
static对函数的作用:
1> 定义一个内部函数
2> 声明一个内部函数
//static声明了一个内部函数
static void test2();
int main()
{
test2();
return 0;
}
//static定义了一个内部函数,这个函数只能在这个文件内部被访问,其他文件不能直接访问,并且其他文件可以定义一个名字完全一个的函数,由于被static修饰,所以会有作用域,
static void test2()
{
}
extern对函数的作用:
1> 完整地定义一个外部函数
2> 完整地声明一个外部函数
(extern可以省略,默认情况下声明和定义的函数都是外部函数)
// 完整地定义一个外部函数
/*
extern void test()
{
printf("调用了test函数\n");
}*/
// 默认情况下,所有的函数都是外部函数,所以可以省略extern
void test() //test函数可以被外界直接访问,默认情况下,只要不是被static修饰的函数都是外部函数,只要外部先对这个函数进行声明就可以直接使用
{
printf("调用了test函数\n");
test2();
}
2. static和extern对变量的作用
2.1 对全局变量的作用
全局变量分为两种:
- 外部变量
- 定义的变量能被本文件和其他文件访问
- 默认情况下所有的全局变量都是外部变量
- 不同文件中的同名外部变量,都代表着同一个变量
// 定义一个外部变量
int a;
- 内部变量
- 定义的变量只能被本文件访问,不能被其他文件访问
- 不同文件中的同名内部变量互不影响
// 定义一个内部变量
static int b;
static对函数的作用:声明和定义一个内部函数
static对变量的作用:定义一个内部变量
extern对函数的作用:定义和声明一个外部函数(extern可以省略)
extern对变量的作用:只起到声明一个外部变量的作用,主要用在变量定义在函数后面,前面想调用这个变量,只能在前面把这个变量进行声明,需要用extern声明
举个栗子
extern int a; //需要在前面用关键字extern进行声明才能被后面的函数调用
int main()
{
//extern int a;//也可以放到函数里面进行声明
a = 10; //a被定义在了后面
return 0;
}
int a;//定义的变量放在了调用者的后面,需要在前面先进性声明extern int a;才能被使用
2.2 对局部变量的作用
static修饰局部变量:
1. 延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁
2. 并没有改变局部变量的作用域
3. 所有的test函数都共享着一个变量b
void test()
{
/*
static修饰局部变量:
1. 延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁
2. 并没有改变局部变量的作用域
3. 所有的test函数都共享着一个变量b
*/
static int b = 0;//static延长局部变量的生命周期,一直存在,直到程序结束
b++;
printf("b的值是%d\n", b); // 3
}
int main()
{
test();//b的值是1
test();//b的值是2
test();//b的值是3
return 0;
}
void test()
{
int a = 0;//代码块被调用后变量就自动销毁,下次调用的时候又重新分配内存空间
a++;
printf("a的值是%d\n", a); // 0
}
int main()
{
test();//a的值是0
test();//a的值是0
test();//a的值是0
return 0;
}
static的使用场合
static修饰局部变量的使用场合:
1.如果某个函数的调用频率特别高
2.这个函数内部的某个变量值是固定不变的
举个栗子
//求圆的周长
void test()
{
static double pi = 3.14; //由于pai是个不变的数据,所以用static修饰,不用每次调用函数重新分配内存空间
double zc = 2 * pi * 10;
}
int main()
{
for (int i = 0; i<100; i++) {
test();
}
}
网友评论