链接性为外部的变量通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量使在函数外部定义的,因此对于所有函数而言都是外部的。可以在文件中位于外部变量定义的后面的任意函数中使用它,因此也称为全局变量。

1、C++单定义规则

        单定义规则(One Definition Rule),是指变量只能有一次定义。

        因此C++给出了以下两种变量声明方式:1、定义声明 2、引用声明。

        1、定义声明(简称定义),它给变量分配存储空间,这是区别于声明的重要点。

        2、引用声明(简称声明),它不给变量分配存储空间,因为它引用已有的变量。也就是说声明只是告诉编译器一下这个变量,所以称为声明,十分好记。声明使用关键字extern,且不进行初始化。

2、外部链接性

以下使用一个C++ Primer Plus上的例子来实践一下外部链接性。

#include<iostream>//这个代码是external.cpp中的内容
using namespace std;

double warming = 0.3;//在这里定义了warming。
void update(double dt);
void local();

int main()
{
	cout << "Global warming is " << warming << endl;
	update(0.1);
	cout << "Global warming is " << warming << endl;
	local();
	cout << "Global warming is " << warming << endl;
	return 0;
}
#include<iostream>//这个是support.cpp中的内容
extern double warming;//在此处引用声明了external.cpp中的warming。

void update(double dt);
void local();

using std::cout;
using std::endl;
void update(double dt)
{
	extern double warming;
	warming += dt;                 //这个函数对warming进行修改并且输出值
	cout << "Update Global warming to" << warming << endl;
}

void local()
{
	double warming = 0.8;          //这里定义了重名变量warming,在之前讲过,会暂时隐藏之前的warming。
	cout << "local warming is " << warming << ".But the global warming is " << ::warming << endl;
}

最后结果如下图所示:

外部 javascript 外部性_ios

 这个例子给了我们以下的要点:

1、在别的文件中extern引用的变量,对其进行修改能够改变它在内存中的值,其原理是引用确实是对该变量的地址进行修改值的,而引用变量的地址即原地址(定义该变量时的地址).

2、单定义规则并不意味着不能有多个变量的名称相同。例如在support.cpp中的local()函数中定义了同名变量warming。在之前的文章中我们对该问题进行了解释:新定义的变量隐藏了旧定义。由于是在函数中定义的,为自动变量,仅仅在该函数中可见,退出该函数后,之前的warming变量又重新可见,因此输出为0.4.

3、内部链接性

        在之前的文章中讲过,将static限定符用于作用域为整个文件的变量的时候,该变量的链接性将为内部的,以下用两个cpp文件来说明。

#include<iostream>
using namespace std;
int tom = 3;
int dick = 30;
static int harry = 300;

void remote_access();

int main()
{
	cout << "mian()中各变量的地址" << endl;
	cout << "&tom:" << &tom <<" &dick:"<<&dick<<" &harry:"<<&harry<<endl;
	remote_access();
	return 0;
}
#include<iostream>
using namespace std;
extern int tom;//声明文件1中的tom,所以应该是同一个地址
static int dick = 10;//定义的静态外部变量,应该不是一个地址
int harry = 90;// 定义的外部变量,应该是一个


void remote_access() {

	cout << "以下是文件2中的变量的地址" << endl;
	cout << "&tom:" << &tom << " &dick:" << &dick << " &harry:" << &harry << endl;
}

实验结果:

外部 javascript 外部性_外部 javascript_02

 实验结果如预料所示,仅有tom的地址为同一个,因为在文件2中tom是extern引用的文件1中的tom。而dick和harry在两个文件中均为一个是外部变量,一个是静态外部变量。在一个文件中,静态外部变量会优先于外部变量(即隐藏外部变量)。