static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样;如果是修改局部变量,则每次调用的时候,保持着上一次的值;
示例1:
//file : main.c
static int a = 0; //全局区,由于加了static,所以限定了其他的.c不能通过extern int a来调用
void test()
{
int b = 0; //栈区,每次test()调用结束后,b会被销毁,所以下次调用的时候,b的值是重新开始的
static int c = 0; //全局区,编译器编译的时候,会把c放在全局区,因此下次调用test()函数的时候, c的保持不变
b++;
c++;
}
void main()
{
int i=0;
for(i=0;i<3;i++)
test();
}
示例2:
//file main.c
static void test()
{
}
void main()
{
test();
}
test函数由于被static修饰,限定了只能本文件中使用,不能在其他.c文件使用。
static的限定使用范围是怎么做到的呢??
其实就是编译器来限定的。当编译器扫描到static所修饰的函数或变量,而其他模块采用extern形式引用了,编译是可以通过的,但在链接的时候,链接器会发现static所修饰的变量或函数会被外部使用了,就会报错。
static语法上的意义是通过编译工具的链接工具来实现的。当编译链接完成后,生成了最终的汇编文件,那么我们还改动其中的汇编代码,还是能在其他模块中使用static函数与变量的。也就是,最终的二进制代码是无法做
到限制变量或函数使用范围的。
sizeof是用来判断一个变量及数据类型所占字节数的。
示例:
void main()
{
int a = sizeof(int);
}
sizeof在编译器编译的时候,就已经算好了,所以上述的code对等效于:
void main()
{
int a =4 ; //编译器编译的时候已经算出了sizeof的值
}