C++ - 外部变量(extern)

标签:
杂谈 |
分类: C++ |
http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_01.png- 外部变量(extern)" TITLE="C++ - 外部变量(extern)" />
std::cout
<< n <<
std::endl;
func();
return 0;
1. 外部变量在程序被编译时(程序运行之前)分配存储,在整个程序运行结束后外部变量占用的存储单元才被回收。
2. 外部变量的作用域:
从外部变量定义之后直到该源文件结束的所有函数,通过做引用说明,外部变量的作用域可以扩大到整个程序的所有文件(只有外部变量有定义性说明和引用性说明之分)。
3. 外部变量的初始化:
在外部变量定义性说明时进行,赋初值的操作在整个程序运行期间仅执行一次,显式初始化值必须是常量表达式,若无显式初始化,则由系统自动初始化为与变量类型相同的0初值。
4. 外部变量的定义性说明和引用性说明:
extern int n; // 或int n;
n的引用性说明
void func()
{
}
int n = 100; // n的定义性说明
int main()
{
}
一个外部变量的定义性说明之多可以有一次显式初始化,而一个程序的不同文件中可能多处引用说明同一个外部变量。为了避免发生多次显式初始化的错误,可在引用性说明前显式地给出存储类型区分符extern,以便与定义性说明相区别。
5. 外部变量的定义性说明:
编译程序处理时将第一次遇到的外部变量说明看成定义性说明(分配存储并初始化),将以后遇到的同名的外部变量说明看成引用说明(不分配存储)。如果前面遇到的外部变量说明均无显式初始化,则将以后遇到的第一次有显式初始化的同名外部变量说明看成定义性说明。
6. 外部变量的引用性说明:
引用说明(例如extern int
n;)可以放在引用外部变量的函数的局部说明部分,也可以放在引用外部变量的函数的前面。在函数体内做引用说明的外部变量只能在该函数内引用,在函数之外做引用说明的外部变量可以在从说明之后至整个文件结束范围内引用。
7. 关于static与extern:
在函数之外的任何说明都称为外部说明,可用于外部说明的存储类型区分符有extern和static,如果缺省存储类型区分符,则被编译默认为extern。对于外部说明,存储类型区分符缺省或用extern说明的变量成为外部变量。
extern和static是两个并列的存储类型区分符,因此不能同时用来修饰变量。
8. 注意:
(1)定义性声明和引用性声明如果都为int num;则会被编译器认为是重定义错误。
(2)定义性声明和引用性声明如果都为extern int num;则会被编译器认为是无法解析符号错误。
(3)定义性声明和引用性声明如果分别为int num;或其显式初始化形式,则也会被编译器认为是重定义错误。
9. 小结:
(VS2005下测试)对于无extern存储类型区分符(即缺省),编译器一定会认为是定义性说明;而对于有extern存储类型区分符的说明形式,则会根据其是否有显式初始化式而区分定义性说明或引用性说明。
多个定义性说明会引起重定义错误。
无定义性说明(仅引用性说明)将引起无法解析符号错误。
通常做法为:定义性说明为缺省extern且显式初始化形式;引用性说明为extern且无显式初始化形式。
使用extern关键字时,表示变量已经在别处定义。
前一篇:C++ - static存储类
后一篇:C++ - 旧式强制类型转换