原创 C语言嵌入式修炼之道

2010-9-5 14:05 1322 7 7 分类: 工程师职场


1.static 全局变量与普通全局变量的区别:


在定义变量时,全局变量之前再冠以 static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。两者在存储方式上并无不同。两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用。由于静态全局变量的作用域局限域于一个源文件内,只能为该源文件内的函数使用,因此可以避免其他源文件 使用该变量。把普通全局变量改变为静态全局变量是改变了他的作用域,限制了他的使用范围。


2.static 局部变量和普通局部变量的区别:


普通局部变量所在的函数每次被调用都会被重新定义并分配存储空间,而 static 局部变量不会,他的值始终保存着。static 局部变量只被初始化一次,下一次使用时依旧是上一次的值。


3.static 函数与普通函数的区别:


static 函数(即静态函数,在函数定义时加上了static 关键字)与普通函数作用域不同,他仅存在于文本文件中。只在当前源文件中使用的函数应该说明为内部函数(即加上static关键字)。内部函数应该在当前 源文件中声明和定义。对于可在当前源文件以外的函数,应该在一个头文件中说明,要使用这个函数的源文件要包含这个头文件。另:程序的普通全局变量存在于堆 栈中,全局变量、static 局部变量存在于静态存储区中。


c語言中static關鍵字有兩個作用,一是文件作用域,二是函數作用域。

一、文件作用域

文件作用域關鍵字static的作用是,以static申明的全局變量、函數不得被其他文件所引用,例如:

//這是mystr.c文件的內容
#include <string.h>

static int num = 10;

int mynum = 100;

static int str_len(char *str)
{
return strlen(str);
}

int mystr_len(char *str)
{
return str_len(str) + num;
}

當你mystr.c文件中的str_len函數加上了static關鍵字,你便不能在其他的地方復用這個函數,譬如,你不能這樣寫:

//這是main.c 的內容

#include <stdio.h>

int main()
{
int len;
len = str_len("hello, world\n");
printf("%d %d\n", num, len )
return 0;
}

gcc main.c mystr_len.c

將不能編譯通過,因為mystr.c中的num變量和str_len函數都用了static關鍵字,導致他們只能在mystr.c中被使用,如文件中的mystr_len函數可以引用num變量和str_len函數。


//這是main.c 的內容

#include <stdio.h>

int main()
{
int len;
len = mystr_len("hello, world\n");
printf("%d %d\n", my_num, len )
return 0;
}

當不用static關鍵字時,等同於extern,即
int mystr_len(char *str)
{
return str_len(str) + num;
}



extern int mystr_len(char *str)
{
return str_len(str) + num;
}

是一樣的。


二、函數作用域

static另外一個用途是函數內部靜態變量,最常用的情況是

int *test()
{
int num = 100;
int *ptr = &num;
return ptr;
}

int main()
{
printf("%d\n", *test);
return 0;
}

該函數返回整數num的指針,在main函數中打印*test將會出現段錯誤,因為num做為test函數內部,只能在test內部被訪問。以下程序是正確的。

int *test()
{
static int num = 100;
int *ptr = &num;
return ptr;
}

int main()
{
printf("%d\n", *test);
return 0;
}

該程序中num變量加了關鍵字static,函數運行結束後,依然可以在其他地方被引用,只是不能直接通過變量名訪問,而要間接通過指針訪問,原因是 static變量存儲在全局數據段中而不是函數棧中。讀者可以將它看作特殊的全局變量,只是其他地方只能通過指針來訪問,而不能直接通過變量名訪問。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条