1. 唯一定义规则
唯一定义规则(one defination rule,简称odr)规定每个变量只能有一个定义。而每个需要使用外部变量(有外部链接性)的文件都必须声明该变量。为了满足这些需要,C++有两种变量声明:
- 定义声明(defining declaration,简称定义definition)为变量分配内存。
- 引用声明(referencing declaration,简称声明declaration)不分配内存,参考已经存在的变量。使用说明符(specifier)关键字
extern
,不提供初始化。
int a; // defination, zero-initialization
extern int b; // declaration, defined elsewhere
extern int c = 3; // defination due to constant-expression initialization
2. 静态生存期,外部链接性
具有外部链接性的(静态)变量称为外部变量,除了定义该变量的文件外,其他使用该变量的文件需要使用关键字extern
(引用)声明该变量。
3. 静态生存期,内部链接性
使用说明符关键字static
前缀的外部变量称为静态外部变量,如果与另一个文件中定义的外部变量重名,则静态外部变量起作用/可见(in scope),仅在一个文件中的函数之间共享数据。
4. 静态生存期,无链接性
自动变量默认无链接性,定义时加上static
前缀后,变成静态局部变量,具有静态生存期。即使所在代码块不活跃,静态局部变量也存在,而且只在代码块中可见。所以,静态局部变量可以在函数调用之间保存数值。虽然一个函数可以被调用多次,但是函数里的静态局部变量只在程序开始运行时初始化一次。
代码示例1
// main.cpp
#include <iostream>
#include <cmath> // atan() arc tangent
#include "coordin.h" // structure templates and function prototypes
using namespace std;
// static variable
double pi = 4.0 * atan(1.0); // dynamic initialization
int num = 0; // count number of invoking rect2polar()
int main(int argc, char const *argv