外部和内部链接性和static关键字


1、作用域:作用域描述了名称在文件中的多大范围类可见。作用域分全局作用域和局部作用域。

2、链接性:链接性为外部的名称可在文件之间共享,链接性为内部的名称只能由一个文件中的函数共享。局部变量不存在共享,也就是说局部变量不存在链接性问题。也就是说链接性为外部的变量可以使用extern关见字把他包含进来由其他文件使用,即和其他文件共享同一个变量;而链接性为内部的变量则不能在其他文件之中使用,如果每个文件中都有一个相同的这个变量,则彼此之间是相互独立的,不存在共享性。比如文件1有一个链接性为外部的变量int e=3;则文件2可以使用extern int e;把e包含进来,两个文件使用的是同一个变量e,文件2对e的修改将影响到文件1中的e的变量。而如果文件1和文件2中的两个变量e的链接性是内部的话,则两个变量将是各自独立的变量,对各自变量的修改不影响另一个文件中的同名变量。

3、再次讨论static静态变量关键字,其基本内容可以参看以前的内容。记住主要的一条规律,静态变量在整个程序之中都存在,如果在函数中则其值只初始化一次,不会在每次进入函数时都初始化该变量。且函数结束时该变量的值仍然存在,也就是说在两次函数调用之间静态变量的值保持不变。如果是全局变量,则可以创建三种类型的静态存储变量,即链接性为外部的静态存储变量,链接性为内部的静态存储变量,无链接性的静态存储变量。下面分别介绍。

4、链接性为外部的静态存储变量的声明方法:这种变量只须在main函数的外部定义一个全局变量即可,定义的全局变量无需使用关键字static。比如在main函数外定义int e=3则为链接性为外部的静态存储变量

5、链接性为内部的静态存储变量的声明方法:即在main函数外定义一个全局变量,且必须使用关见字static加以限定。比如在main函数外定义static int e=4;则为链接性为内部的静态存储变量。

6、无链接性的静态存储变量:即在代码块中使用static定义的局部变量,比如在main函数中定义的static int e=3;

7、要正确使用外部文件的外部链接性存储变量则必须在文件中使用extern关见字,比如在文件1中定义int e=3;则在文件2中应使用extern int e;把文件1中定义的全局变量包含进来。


a、注意不能在文件2中使用extern的同时再对变量e赋值,比如extern int e=4;这样将出错;
b、同样如果在文件2中不使用关见字extern而直接使用文件1中的全局变量e则将出现变量e为没有声明的标识符的错误;

c、如果在文件2中不使用关见字extern而重新定义一个全局变量e如int e=4;则将出现程序中有多个声明相同的变量e的错误,即对e进行了重定义;

d、如果在文件2中不使用关见字extern而使用关见字static声明一个链接性为内部的静态存储变量的时候则这个变量将隐藏掉文件1中的全局变量e,比如在文件2中有static int e=4则静态变量e将隐藏掉文件1中的全局变量e。

8、如果静态存储变量的链接性是内部的即在程序中声明了一个static的静态全局变量,则这个变量只能在这一个文件中使用,比如文件1和文件2中都有一个static int e=4;的声明,则各自文件访问的将是各自的静态变量e,对其中一个的修改不影响另一个,比如文件2中把e值改为5,则文件1中的变量e仍然为4,不受影响。不能使用extern关见字把static的静态全局变量包含在另一个文件中,即不能有语句extern static int e;这样的声明,如果出现这样的声明将会是一种语法错误。


9、::作用域解析运算符的使用:如果声明了一个链接性为内部或外部的静态存储变量,而函数中又声明了一个相同的局部变量,而这个函数又要使用外部定义的静态变量,这时就可以使用::作用域解析运算符来访问该变量。比如static int e=3; 有函数void g(){int e=4; cout<<e<<::e<<endl;}其中后面的::e将输出static int e的值3。


10、再谈const修饰符,const修饰符与链接性:声明的全局const常量的链接性为内部的,也就是说全局const常量只能
在同一个文件中的函数所共享,这就是为什么可以把const常量放在头文件中的原因;当每个文件都使用#include把头文件包含进来的时候每个文件都有一个const常量的声明,但这些声明只能在同一个文件中使用,所以不会出现名称重定义的错误。也可以把const常量声明为链接性为外部的,其方法为在const前面使用extern关见字,比如extern const int e=3;这样在要使用该常量的文件中就必须使用extern关见字把该常量包含进来11、函数的链接性:函数的链接性默认为外部的,可以使用static关见字把函数声明为具有内部链接性

//链接性和static关见字示例


//文件hyong.cpp中的内容,注意是.cpp源文件而不是头文件

#include"stdafx.h

int e=3;//声明一个链接性为外部的全局变量e。
static int e1=33;//声明一个链接性为内部的全局变量e1,注意,因为的链接性为内部,所以该变量只能在本文件中使用,不能用extern关见字包含在其他文件中使用。
//主文件ff.cpp中的内容。
#include"stdafx.h"

#include<iostream>

using namespace std;
//int e=10//错误,对变量e进行了多次定义。要使用文件hyong中的外部链接变量e需使用extern关见字把他包含进来。
extern int e;  //使用extern把文件hyong中的外部链接变量包含进来,以便能在当前文件中使用,如果不使用extern将其包含进来而直接使用变量e就将出现标识符e未声明的错误。
//extern int e=12//错误,在使用extern包含文件hyong中的外部链接全局变量时不能再对其赋值。

//static int e=100//正确,如果在本文件中使用该语句就将隐藏掉文件hyong中的外部链接全局变量e。
//extern static int e1=3; //错误,语法错误。试图将文件hyong.cpp中的链接性为内部的全局变量包含进来,这是不可能的事情。
voidg(){int e=3//输出,在函数g中定义的同名变量e将隐藏掉文件hyong中定义的外部链接全局变量e,这里nfe将访问文件hyong中的全局变量e,输出数字三。
voidf(){

static int ee=33; 

cout<<ee<<endl;

}//定义静态局部变量,静态局部变量将只初始化一次,且值在两次调用之间保持不变。

intmain()

{  

g(); //调用函数g
f();

f();

}// 两次调用函数f,第一次调用输出33,第二次调用输出‰.,即静态局部变量在两次调用之间值保持不变,不随函数的结束而值就不存在,且静态局部变量只初始化一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值