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();
}