---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、static和extern与函数
外部函数:定义的函数能被本文件和其他文件访问
1> 默认情况下所有函数都是外部函数
2> 不允许有同名的外部函数
内部函数:定义的函数只能被本文件访问,其他文件不能访问
1> 允许不同文件中有同名的内部函数
static对函数的作用:
1> 定义一个内部函数
2> 声明一个内部函数
extern对函数的作用:
1> 完整地定义一个外部函数
2> 完整地声明一个外部函数
(extern可以省略,默认情况下声明和定义的函数都是外部函数)
Main.c文件
// 声明一个test函数
// 完整地声明一个外部函数
// extern可以省略
//extern void test();
void test();
//void test2();
int main()
{
test();
//test2();
return 0;
}
//void test()
//{
//
//}
static void test2()
{
}
One.c文件
#include <stdio.h>
// 声明一个内部函数
static void test2();
// 完整地定义一个外部函数
/*
extern void test()
{
printf("调用了test函数\n");
}*/
// 默认情况下,所有的函数都是外部函数,所以可以省略extern
void test()
{
printf("调用了test函数\n");
test2();
}
// 定义一个内部函数
static void test2()
{
printf("调用了test2函数\n");
}
二,static和extern与变量
static用来定义一个内部函数,不允许其他文件访问;extern用来定义和声明一个外部函数,允许其他文件访问。static和extern对变量也有作用,不过跟函数有点差别。
在C语言中,全局变量定义的位置是有限制的,默认情况下,一个函数不可以访问在它后面定义的全局变量
如果前面定义的main函数中尝试访问后面定义的变量a,编译器直接报错了。
解决这个错误的话,有2种办法:
第1种办法:将变量a定义在main函数的前面
第2种办法:在main函数前面对变量a进行提前声明
也就是让main函数知道变量a的存在就行了,至于变量a定义在哪个位置,main函数不用管。
* 完整的变量声明需要用extern关键因为extern是用来声明一个已经定义过的变量。
/*
全局变量分2种:
外部变量:定义的变量能被本文件和其他文件访问
1> 默认情况下,所有的全局变量都是外部变量
2> 不同文件中的同名外部变量,都代表着同一个变量
内部变量:定义的变量只能被本文件访问,不能被其他文件访问
1> 不同文件中的同名内部变量,互不影响
static对变量的作用:
定义一个内部变量
extern对变量的作用:
声明一个外部变量
static对函数的作用:
定义和声明一个内部函数
extern对函数的作用:
定义和声明一个外部函数(可以省略)
main.c文件
*/
#include <stdio.h>
void test();
// 定义一个外部变量
//int a; 这么多个a都是代表同一个a
//int a;
//int a;
//int a;
//int a;
// 定义一个内部变量
static int b;
// 声明一个外部变量
//extern int a;
int main()
{
//b = 10;
//test();
extern int a;
a = 10;
/*
a = 10;
test();
printf("a的值是%d\n", a);*/
return 0;
}
int a;
one.c 文件
#include <stdio.h>
int a;
static int b;
void test()
{
printf("b的值是%d\n", b);
/*
printf("a的值是%d\n", a);
a = 20;*/
}
Static对局部变量的作用
#include <stdio.h>
/*
static修饰局部变量的使用场合:
1.如果某个函数的调用频率特别高
2.这个函数内部的某个变量值是固定不变的
*/
void test()
{
static double pi = 3.14;
double zc = 2 * pi * 10;
int a = 0;
a++;
printf("a的值是%d\n", a); // 1
/*
static修饰局部变量:
1> 延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁
2> 并没有改变局部变量的作用域
3> 所有的test函数都共享着一个变量b
*/
static int b = 0;
b++;
printf("b的值是%d\n", b); // 3
}
int main()
{
for (int i = 0; i<100; i++) {
test();
}
test();
test();
test();
return 0;
}
static和extern的总结
1.extern可以用来声明一个全局变量,但是不能用来定义变量
2.默认情况下,一个全局变量是可以供多个源文件共享的,也就说,多个源文件中同名的全局变量都代表着同一个变量
3.如果在定义全局变量的时候加上static关键字,此时static的作用在于限制该全局变量的作用域,只能在定义该全局变量的文件中才能使用,跟其他源文件中的同名变量互不干扰
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com