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;}执行结果:
- C语言中的static
- c 语言中的static
- C语言中的Static
- C语言中的static
- C语言中的static
- c语言中的static
- c语言中的static
- C语言中的static
- C 语言中的static
- C语言中的static
- C语言中的static
- C 语言中的static
- C语言中的static
- C语言中的static
- C语言中的static
- c语言中的static
- C语言中的static
- C语言中的static
- 坚持责任和安全意识当先
- Linux 命令行快捷键
- linux 下整合apache和tomcat
- linux 内存映射机制
- 131. Palindrome Partitioning
- C语言中的static
- 主要的框架库的链接引入
- 编写一个程序,求出满足下列条件的四位数:该数是个完全平方数,且第一、三位数字之和为10,第二、四位数字之积为12
- 算法--查找--总结篇
- 活动的生命周期(三):实例上机课
- 1
- mysql优化
- 心得+接下来...
- 编程练习六(最小生成树)