您的位置:首页 > 其它

overlay/static/register/atuo/extern/volatile/const 修饰符的用法

2013-11-23 14:21 483 查看

static

l静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。
l静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。
l在函数体内生成的静态变量它的值也只能维持
intmax_so_far(intcurr)
//求至今(本次调用)为止最大值


{


staticintbiggest;
//该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期


if(curr>biggest)


biggest=curr;


returnbiggest;


}

l在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。

l类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。如,



floatSavingsAccount::currentRate=0.00154;








(注:currentRate是类SavingsAccount的静态成员变量)






register

l用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对32位编译器不起作用,当globaloptimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对32位编译器有效。

auto

l它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。

extern

l声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。
l在C++中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前MicrosoftC/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:
uextern“C”声明语句

uextern“C”{声明语句块}

volatile

l限定一个对象可被外部进程(操作系统、硬件或并发线程等)改变,声明时的语法如下:
intvolatilenVint;


这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。
只常用于像中断处理程序之类的异步进程进行内存单元访问。


const

lconst所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。
l在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量,如
constintmaxarray=255;


charstore_char[maxarray];
//C++中合法,C中不合法


lconst修饰指针时要特别注意。例:

char*constaptr=mybuf;
//常量指针




*aptr='a';//Legal







aptr=yourbuf;//Error







constchar*bptr=mybuf;
//(指针bptr)指向常量数据




*bptr='a';//Error







bptr=yourbuf;//Legal







lconst修饰成员函数时不能用于构造和析构函数。


volatile  表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.  该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。  简单示例:   DWORD__stdcallthreadFunc(LPVOIDsignal)   {     int*intSignal=reinterpret_cast(signal);     *intSignal=2;     while(*intSignal!=1)     sleep(1000);     return0;   }  该线程启动时将intSignal置为2,然后循环等待直到intSignal为1时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:     movax,signal     label:     if(ax!=1)     gotolabel  对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C编译器是没有线程概念的,这时候就需要用到volatile。volatile的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:     label:     movax,signal     if(ax!=1)     gotolabel  注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: