C语言中的static

来源:互联网 发布:顶易软件多少钱 编辑:程序博客网 时间:2024/06/07 09:28

利用static属性隐藏变量和函数名字 C程序员使用static属性在模块内部隐藏变量和函数声明,就像你在Java和C++中使用public和private声明一样。C源代码文件扮演模块的角色。任何声明带有static属性的全局变量或者函数都是模块私有的。类似的,任何声明为不带static属性的全局变量和函数都是公共的,可以被其他模块访问。尽可能用static属性来保护你的变量和函数是很好的编程习惯。
———《深入理解计算机系统》

下面引自博文static作用(修饰函数、局部变量、全局变量)
所有例子在ubunut16.04,gcc5.4.0中运行通过, 并做了一定的修改。

在C语言中static声明有三个作用。

(1)第一条也是最重要的一条:隐藏
当我们同时编辑多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例说明。一个是a.c,另一个是main.c。

a.c

#include <stdio.h>char a = 'A'; //global variablevoid msg(){    printf("Hello\n");}

main.c

#include <stdio.h>void msg(); // declare the functionintmain(){    extern char a; //extern variable must be declared before use        printf("%c\n", a);    (void)msg();        return 0;}

结果:
这里写图片描述

你可能会问:为什么a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它源文件中也能访问,当然前提是要先声明,否则编译器会报错:
这里写图片描述

如果加了static就会对其它源文件隐藏。例如在a和msg的定义前面加上static,main.c就看不见他们了。这样编译的时候就会报下面的错误:
这里写图片描述
利用这一特性可以在不同文件中定义同名函数和同名变量,而不必担心命名冲突。对于函数,static的作用仅限隐藏;而对于变量还有一下两个作用。

(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化(实际上应该在链接阶段),也是唯一一次初始化(因为程序一旦开始运行在text段根本没有这段代码)。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来static可以控制可见性。举例如下:

main.c

#include <stdio.h>int fun(void) {    static int count = 10;    return count--;}int count = 1;intmain(void){    printf("global\t\tlocal static\n");    for(; count <= 10; ++count)        printf("%d\t\t%d\n", count, fun());    return 0;}

程序的运行结果如下:
这里写图片描述

(3)static第三个作用是默认初始化为0。其实全局变量也具备这个属性,因为全局变量也存储在静态存储区。在静态存储区,内存中所有字节的默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个的把所有元素都置为0,然后把不是0的几个元素赋值。如果定义成静态的就省去了一开始的置0操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加上’\0’太麻烦。如果把字符数组定义成静态的,就省去了这个麻烦,因为哪里本来就是’\0’。不妨做个小实验验证一下。

main.c

#include <stdio.h>int a;int main(void){    int i;    static char str[10];    printf("integer:%d; string:(being)%s(end)\n", a, str);    return 0;}执行结果:

这里写图片描述

0 0
原创粉丝点击