Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128298
  • 博文数量: 21
  • 博客积分: 850
  • 博客等级: 准尉
  • 技术积分: 146
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-26 20:50
文章分类
文章存档

2011年(4)

2010年(17)

我的朋友

分类: C/C++

2010-05-19 11:16:53

C中static函数的作用
原文:http://hi.baidu.com/wwq100/blog/item/1c679002189e93094bfb51aa.html

1、函数之外的变量就是全局变量,这个想法正确吗?
答: 在C中,完全正确。只不过按有没有加static修饰可以分为静态全局变量和一般全局变量两种。
2 如果在全局变量的前面加上static 会有什么用?
答:在C中,静态全局变量意味着两个方面。一、在生命期方面,它与一般全局变量一样,是与整个程序共存亡的;二、在可见性方面,它只在定义它的那个编译单元中可见。比如说,你在testA.c中定义了一个静态全局变量x: static int x;则你只能在testA.c的函数中引用它,在另一个文件testB.c中如果想用它的话:extern int x;然后再某个函数中使用x,则一般编译器在连接阶段会报错说找不到x这个符号。
3 如果在函数的前面加上static 会有什么用?
答:与静态全局变量差不多。简单地说,在testA.c中定义的静态函数:static void A(void)是不能在testB.c的函数中调用的,如果一定要这样的话编译器连接时会报错的。

static的用途:一般对那些非接口函数和确定外部不使用的全局变量加上static限制,可以保证不会被其它编译单元非法使用,同时也可以避免与别的编译单元中的同名符号冲突。在驱动程序中用的较多。




static变量和static函数

原文:

在C语言编程中,static的一个作用是信息屏蔽!

比方说,你自己定义了一个文件 -- 该文件中有一系列的函数以及变量的声明和定义!

你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用!


而在C++中,用static来作为信息屏蔽就显得没有必要了!因为,C++有了信息屏蔽的利器 -- class机制!

类中的private属性的变量和函数就对外禁止访问!


然后是C/C++通用的函数作用域的static型的变量!其目的,也是为了信息的屏蔽!


int fun() {
   static int a = 1;
   a++;
}

在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1!

以后每次进入该函数,a就不会被再次初始化了,仅进行自增1的操作!

在static发明前,要达到同样的功能,则只能使用全局变量:

int a = 1;

int fun() {
   a++;
}

那么,a的值就有可能被其他函数所改变!



最后,说说类中的static变量和函数。


这种存储属性的变量和函数是同一种类的不同实例之间通信的桥梁!


#include 
using namespace std;

class A {
public:
    static int num;    //    统计创建了多少个实例
    A () {num++};    //    每创建一个实例,就让num自增1

    //    返回通过构造函数所创建过的A类实例的数目
    static int how_many_instance() {
        return num;
    }
}

static A::num = 0;    //    需要在类申明的外部单独初始化!


int main() {
    cout << A::how_many_instance() << endl;
    A a, b, c, d;
    cout << A::how_many_instance() << endl;
    system("pause");
}


一般,在类内部,是通过static属性的函数,访问static属性的变量!

补充一点,在类中,static型的成员函数,由于是类所拥有的,而不是具体对象所有的,这一点对于windows的回调机制非常有用。
因为对于回调函数而言,windows不会借助任何对象去调用它,也就不会传递this指针,那么对于一般成员函数作为回调函数的后果,就是堆栈中有一个随机的变量会成为this指针,这当然会引发程序的崩溃。
而static函数,由于是整个类的,屏蔽了this指针。因此,如果成员函数作为回调函数,就应该用static去修饰它。
阅读(2449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~