C++之extern

声明和定义

  为了弄清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表明此变量是外部文件定义的。另外在相应的源文件内,定义相应的变量。

例子

1
2
3
4
5
6
7
//file1.h
extern int a;//表示声明一个外部的int型a
int a;//错误,这是一个定义,不应出现在头文件中,若多次被include,会造成重名
const int a;//正确,const默认是其他文件不可见的,只有include的源文件才可见到,并只能在此源文件中存在
分享到