C++中声明的单定义规则(ODR)的使用详解

C++中声明的单定义规则(ODR)的使用详解

链接性为外部的变量通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量是在函数外部定义的,因此对所有函数而言都是外部的。例如,可以在main()前面或头文件中定义它们。可以在文件中位于外部变量定义后面的任何函数中便用它,因此外部变量也称全局变量(相对于局部的自动变量)。

一方面,在每个使用外部变量的文件中,都必须声明它;另一方面,C++有“单定义规则”(One Definition Rule,ODR),该规则指出,变量只能有一次定义。为满足这种需求,C++提供了两种变量声明。一种是定义声明(defining declaration)或简称为定义(definition),它给变量分配存储空间;另一种是引用声明(referencing declaration)或简称为声明(declaration),它不给变量分配存储空间,因为它引用已有的变量。

引用声明使用关键字exter,且不进行初始化;否则,声明为定义,导致分配存储空间:

double up;            //definition, up is 0
extern int blem;      //blem defined elsewhere
extern char gr = 'z'; //definition because initialized

参见【0voice C++】如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使用关键字extem 声明它:

// file01.cpp
extern int cats = 20;  // definition because of initialization
int dogs=22;           // also a definition
int fleas;             // also a definition
...
// file02.cpp
// use cats and dogsfrom file0l.cpp 
extern int cats;  // not definitions because they use
extern int dogs;  // extern and have no initialization
...
// file98.cpp
// use cats,dogs,and fleas from file0l.cpp
extern int cats;
extern int dogs;
extern int fleas;
...

在这里,所有文件都使用了在fle01.cpp中定义的变量cats和dogs,但fle02.cpp没有重新声明变量feas,因此无法访问它。在文件 file01.cpp 中,关键字extem 并非必不可少的,因为即使省略它,效果也相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值