首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C语言中的static 详细分析(3)

C语言中的static 详细分析(3)

运行如上所示。可以看出,函数每次被调用,普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。需要注意的是由于static局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。这在多线程编程时可能会成为一种隐患。需要多加注意。

       三,static函数
              相信大家还记得C++面向对象编程中的private函数,私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。
            当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数”。
           所以static函数的作用域是本源文件,把它想象为面向对象中的private函数就可以了。
下面是一些示例:
file1.h如下:
[cpp] view plaincopy

  • #include <stdio.h>

  • static
    int called();  
  • void printStr();  

file1.c如下:
[cpp] view plaincopy

  • #include "file1.h"

  • static
    int called()  
  • {  
  •     return 6;  
  • }  
  • void printStr()  
  • {  
  •     int returnVal;  
  •     returnVal = called();  
  •     printf("returnVal=%d\n",returnVal);  
  • }  

file2.c中调用file1.h中声明的两个函数,此处我们故意调用called():
[cpp] view plaincopy

  • #include "file1.h"

  • int main()  
  • {  
  •     int val;  
  •     val = called();  
  •     printStr();  
  •     return 0;  
  • }  

编译时会报错:
[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
file1.h:3: 警告:‘called’ 使用过但从未定义
/tmp/ccyLuBZU.o: In function `main':
file2.c.text+0x12): undefined reference to `called'
collect2: ld 返回 1

因为引用了file1.h中的static函数,所以file2.c中提示找不到这个函数:undefined reference to 'called'
下面修改file2.c:
[cpp] view plaincopy

  • #include "file1.h"

  • int main()  
  • {  
  •     printStr();  
  •     return 0;  
  • }  

编译运行:
[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
[liujx@server235 static]$ ./file2
returnVal=6


       static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。
继承事业,薪火相传
返回列表