声明和定义
为了弄清extern,首先要弄清楚声明(Declare)和定义(Define)的区别。
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量是我们声明了她的类型和名字。可以通过使用extern关键字声明变量名而不定义它。
const
另外,我们还需要弄清楚const的作用。
在原文件中,定义一个变量默认是extern
的,即是其他文件可见的,若定义一个变量使用const
修饰符,则表明此变量不是extern
的,即只有本文件可见(与static
的功能类似)。
头文件
头文件中可以定义类、值在编译时就已知道的const
对象和inline
函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。
通过const和头文件的描述
我们不难发现const
变量为什么默认不是extern
的:在头文件中定义的const常量在每个include的源文件中都会定义一遍,但是由于const
常量默认是不带有extern
的,所以const
常量是只能在本文件中存在的。另外,一般在编译过程中,编译器会将const
常量替换成相应的字面值,所以在头文件中定义const
常量是合理的,且一般不会造成内存使用过多。
在头文件中的extern
extern
的主要目的是用于声明,头文件也是用于声明的,所以头文件中的非const
变量必须在前面加上extern
表明此变量是外部文件定义的。另外在相应的源文件内,定义相应的变量。
例子
|
|