C/C++中涉及存储方式的关键字:auto,static,register,extern

register关键字:只有函数参数和局部变量可被声明为register。意思是,在可能的情况下,该变量被存储在CPU寄存器中。register变量和auto变量一样,它的生命周期只维持在它所声明的块中。编译器并不赞成程序员指定register变量。实际的情况是,编译器会根据全局优化的需要自动决定是否采用register类型。

extern关键字:extern用在声明语句中表示该对象或变量是在其它编译单元中(不能说是其它文件,因为有些文件,如头文件不是编译单元)定义的;如果用在定义语句中,表示该变量对外部可见。注意extern与#include作用的区别:例1,使用extern://out.hint a = 10;

//out.cpp#include "out.h"

//example.cpp#include <iostream>using namespace std;

extern int a;int _tmain(int argc, _TCHAR* argv[]){cout<<"a="<<a<<endl;system("pause"); return 0;}编译链接流程:由于out.cpp文件引用了out.h文件,所以out.cpp文件的内容变成了int a =10;,编译时生成编译单元out.obj(out.o),其中定义了变量a。example.cpp文件中出现了对a的引用cout<<"a="<<a<<endl;,但该文件中没有a的定义(extern inta;只是一个声明),而且包含的头文件中也没有,但是由于有声明extern inta;,表明a是在其它编译单元中定义的,,编译不出错。最后链接器在编译单元out.obj(out.o)中找到a的定义,建立连接关系,生成最后的exe文件。该工程中有两个编译单元,最后链接成一个exe文件。

例2,使用#include://out.hint a = 20;

//example.cpp#include "out.h"#include <iostream>using namespace std;

int _tmain(int argc, _TCHAR* argv[]){cout<<"a="<<a<<endl;system("pause"); return 0;}编译链接流程:example.cpp文件中出现了对a的引用cout<<"a="<<a<<endl;,但该文件中没有a的定义,但是包含的头文件out.h中有,这样在编译之前,头文件out.h展开到example.cpp文件中,相当于example.cpp文件中定义了a(int a = 20;),编译成功。最后链接器链接编译单元生成最后的exe文件。该工程中只有一个编译单元,最后链接成一个exe文件。

带着我的相机和电脑,远离繁华,走向空旷。

C/C++中涉及存储方式的关键字:auto,static,register,extern

相关文章:

你感兴趣的文章:

标签云: