auto
变量的作用域:
- 变量可以作用的范围。一般都是花括号里面。
变量的生命周期:
- 变量从被创建到销毁所经历的时间。
可以认为局部变量都默认是auto的,但是你不写编译器也知道。该关键字几乎不用了。
register
当你使用register去修饰一个变量时,编译器会尽可能将该变量放在CPU的寄存器中而非内存中,所以CPU访问该变量的速度是很快的。
几点注意:
- 1,register修饰的最好是局部变量。因为全局变量会一直占用寄存器。
- 2,不会被写入。写入就要写回内存。那么该变量设为register就没有意义。
- 最好是高频读写的。
- 无法被&符号取地址。
- 不要被大量使用,因为寄存器有限。
为什么要有头文件
很多时候我们有这样的需求:在一个源文件中使用另一个源文件的函数或者变量。那么能不能直接使用呢?
- 函数可以,但是会警告,函数只要链接找到就可以。(只限于自己写的函数,想要使用库函数或者别的函数必须包含声明)。
- 而变量必须声明过才可以使用,且不能在声明的时候赋值。因为声明不开辟空间。
但是如果我有100个源文件,每个源文件都要使用同一个全局变量,那么怎么办呢?我难道要写100遍声明吗?
所以,一个好的处理方法就是,将这些声明提取到1个共用的文件中,以便于项目的维护。而这个文件就是头文件。而每个想要使用其中变量或者函数的源文件,只需要包含该头文件即可。
- 头文件包含的内容:
static
我们知道了全局变量和函数是可以跨文件的。而函数甚至不用声明就可以使用。那么有没有办法保证你的函数无法直接被其他源文件使用呢?
- static修饰全局变量,表示该变量只能在源文件内部使用。改变了该变量的作用域。但是可以间接使用。
- static修饰函数,表示该函数只能在该源文件内部使用。但是可以嵌套式的间接使用。
- static的特性为C语言提供了封装性的可能。保证了项目的安全性。
/************* test.c文件 ***************/
static int g_val = 100; //g_val无法被外部文件直接访问。因为static
int show_val() {
printf("%d\n", g_val); //但是可以通过show函数访问;因为show函数可以被其他源文件访问
}
static void test(){ //被static修饰,无法被外部直接访问
// do something...
}
void show_test(){
test(); //但是可以通过嵌套,间接访问
}
- static修饰局部变量,该变量的生命周期
extern
- 在变量前面,表示声明该变量。全局变量声明必须带上extern,否则就可能引起编译器的二义性。不带上无法分辨是定义还是声明。
- 函数可以不带,因为编译器可以分辨出函数的定义和声明,但是为了保持好习惯,建议带上。