天天看点

const, static, extern, volatile的主要用法

const的用法:(1)定义常量(const数据成员的初始化只能在类的构造函数的初始化表中进行,且必须初始化)

  (2)修饰函数的参数(常指针,常引用)

  (3)修饰函数的返回值(const char * GetString(void);)

  (4)修饰函数的定义体(任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成     员函数,编译器将指出错误,这无疑会提高程序的健壮性)

static的用法:(1)声明静态局部变量,让函数中局部变量的值在函数调用结束后不消失而保留原值

  (2)声明静态全局变量/函数,只限于被本文件使用。在一个.h文件中声明了一个static 函数,那么,在其他两个或多个.c文件中包含此.h文件,就不会出现重复定义的问题。

                          (3)声明静态数据成员/成员函数,指示变量/函数属于一个类而不是属于此类的任何特定对象的变量和函数,static成员只能在类体外进行初始化

extern的用法:(1)在一个文件内声明全局变量,声明提前引用

   (2)在多文件的程序中声明全局变量,将变量作用域扩展到本文件,避免重复定义

volatile的用法:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器不会去假设这个变量的值。精确地说就是,优化器(编译器)在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 

   (1) 并行设备的硬件寄存器(如:状态寄存器) 

   (2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 

   (3) 多线程应用中被几个任务共享的变量

static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

文件a.c

static int i; //只在a文件中用

int j; //在工程里用

static void init() //只在a文件中用

{

}

void callme() //在工程中用

{

static int sum;

}

上面的全局i变量和init()函数只能用在a.c文件中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文件。所以可以在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或者函数在其他文件里已经被定义了。

文件b.c

extern int j; //调用a文件里的

extern void callme(); //调用a文件里的

int main()

{

...

}

extern的另外用法是当C和C++混合编程时如果c++调用的是c源文件定义的函数或者变量,那么要加extern来告诉编译器用c方式命名函数:

文件A.cpp调用a.c里面的变量i和函数callme()

文件A.cpp

extern "C" //在c++文件里调用c文件中的变量

{

int j;

void callme();

}

int main()

{

callme();

}