首页 > 代码库 > 从LLVM源码学C++(六)
从LLVM源码学C++(六)
今天看clang的有关DeclSpec.h,看到有关关键字的一些信息。这里总结一下
知识点:各种关键字
C++关键字(static/register/atuo/extern/volatile/const)释疑 下面关于C++的几个关键字是经常和我们打交道的而我们又经常对这些含糊不清的, 本文根据自己的学习体会作以总结,以期达到真正理解和活用的目的。
static 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。 静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。 在函数体内生成的静态变量它的值也只能维持
int max_so_far( int curr )//求至今(本次调用)为止最大值 { static int biggest; //该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期 if( curr > biggest ) biggest = curr; return biggest; } 在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享, 也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数 也只能访问静态成员(变量或函数)。
类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。 如,float SavingsAccount::currentRate = 0.00154; (注:currentRate是类SavingsAccount的静态成员变量)
register 用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对32位编译器不起作用, 当global optimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与register关键字 有关的其它符号都对32位编译器有效。
auto 它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
extern 声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的, 即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。 在文件内声明一个变量或函数默认为可被外部使用。 在C++中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。 目前Microsoft C/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式: extern “C” 声明语句 extern “C” { 声明语句块 }
volatile 限定一个对象可被外部进程(操作系统、硬件或并发线程等)改变,声明时的语法如下: int volatile nVint; 这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。 只常用于像中断处理程序之类的异步进程进行内存单元访问。
const const所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。 在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。
在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define, 且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中, 在C中const声明一个变量,除了不能改变其值外,它仍是一具变量,如 const int maxarray = 255; char store_char[maxarray]; //C++中合法,C中不合法 const修饰指针时要特别注意。例: char *const aptr = mybuf; // 常量指针 *aptr = ‘a‘; // Legal aptr = yourbuf; // Error const char *bptr = mybuf; // (指针bptr)指向常量数据 *bptr = ‘a‘; // Error bptr = yourbuf; // Legal const修饰成员函数时不能用于构造和析构函数。