1. 全局变量、const和extern:
如果const对象在编译时可以确定其值,可以将其放在头文件中定义。这样做的原因是 const对象默认情况下是定义该变量的所在文件的局部变量,这样即使次头文件被多个包含,都不会在包含这些文件中重复定义此变量,所有对于这个const对象的引用全部指向在头文件中定义的对象。但是如果在const对象定义的时候声明extern,const对象就变得和普通非const对象一样,从而失去此特性,因为非const对象的默认属性为extern。这种情况下用extern 声明的const变量就不可以在头文件中定义,因为这个变量可以在别的文件中被extern包含使用,所以有可能重复定义。
假设我们在文件1.cpp中定义了一个全局变量bufsize,文件1.cpp中当然可以访问它,如果我想在另外一个文件2.cpp中访问这个全局变量,这时候需要在文件2.cpp中声明这个变量。
//1.cpp
int bufsize;
//2.cpp
extern int bufsize;
这说的是非const的全局变量,如果是const的全局变量,如果想要被其他文件访问,需要在定义的时候,加上extern关键字,表示它可以在其他文件被声明使用的,即可以被整个程序(一个程序可能包括多个源文件)访问,否则的话,这个变量只能在它被定义的文件里面被访问,其他文件不能访问。
//1.cpp
extern const int bufsize=10;
//2.cpp
extern const int bufsize;
这时候你也许会问,为什么非const变量定义的时候为什么没有extern?
答:非const变量默认为extern, const变量默认为文件的局部变量 。而const变量如果想要在其他文件里被访问,必须显示的指定它为extern。
2.全局变量、static:
在c++中关键字extern是声明一个变量却不定义它,即不给它一个存储空间。意义是“通过extern关键字扩展全局变量 x的作用范围(即扩展到包含该文件的文件中)”。并不是所欲的变量都能用extern声明,只有全局变量并且没有被static声明的变量才能声明为extern。所以如果不想自己源文件中全局的变量被其他文件引用,可以给变量加上static声明。
静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。
在c++中,const限定符对默认存储类型稍有影响。在默认情况下,全局变量的链接性为外部的,也就是说在别的文件中也可以使用;但是const类型的全局变量的链接性为内部的,也就是说const类型的全局变量值在本文件内是可见的,别的文件不可以使用,因此,全局const定义就像使用了static说明符一样。
因此,可以将 const 常量定义在头文件中供工程中的多个其它文件包含引用,并且编译时不会产生变量重复定义的错误。当然,也可以用 #define 宏定义。
关于const类型的具体解析可以查看这个网址http://blog.csdn.net/Eric_Jo/article/details/4138548
3. 头文件应用于声明而不是用于定义。
这并不是一个硬性规定,比如有时候const变量可以在头文件中定义。但是如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。即使使用预处理器避免多重包含,这里的多重包含指的是同一个文件直接或者间接包含一个头文件多次。而需要注意的是,避免多重包含的措施只能避免该头文件在同一个编译单元内被包含一次,在不同编译单元内还是会被多次包含的,这样就造成了变量的重复定义。
4. 宏定义和const
http://blog.csdn.net/potato512/article/details/51454329
5. 关于各种存储区域比较好的解释
http://blog.csdn.net/u013765220/article/details/53063698