c语言3种链接属性: 外部(external), 内部(internal),无设置(none)
c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢?
c语言中有3种链接属性: 外部(external), 内部(internal),无设置(none)
外部(external): 使用extern关键字
内部(internal): 使用static关键字
小结一下:
1.extern的修饰中在工程必须要有一个变量的定义,否则不能能使用。
2.extern使用之后可是实现全部工程的不同文件使用相同的变量
3.internal的属性方式,通过static来进行修饰仅仅是在改文件中可以使用,但是在其他的文件中则不能访问。
对各种情况进行一些测试吧
第一步测试,在两个文件中定义相同名称的变量
unit1.c
--------------------
int a = 10;
void printtest1()
{
printf("print test at %s, variable a = %d/n", __FILE__, a);
}
unit2.c
-------------------
int a = 20;
void printtest2()
{
printf("print test at %s, variable a = %d/n", __FILE__, a);
}
main.c
------------------
void printtest1();
void printtest1();
int main(int argc, char *argv[])
{
printtest1();
printtest2();
system("PAUSE");
return 0;
}
编译时提示错误 unit2.c multiple definition of 'a' ,由于unit1.c和unit2.c都定义了a
第一步测试结论:如果在不同的文件中定义相同名字的变量,编译器无法通过编译
第二步测试,把其中一个声明改成extern
这个时候把unit2.c改造一下
extern int a;
void printtest2()
{
printf("print test at %s, variable a = %d/n", __FILE__, a);
}
unit2中使用extern标示该变量是外部链接的, 这样编译通过了,结果显示unit1和unit2中a的值都为10,OK,值相同了,那么真的是同一个变量了吗,修改一下值再确认一下
改造一下main.c,修改a的值
extern int a;
a = 20;
printtest1();
printtest2();
a = 30;
printtest1();
printtest2();
这个时候输出为
unit1.c 20
unit2.c 20
unit1.c 30
unit2.c 30
可以确认的确是使用了同一个变量了。
第二步测试结论;使用extern可以访问其他文件中定义的变量
第三步测试把其中一个声明使用static标示
首先在unit1.c这把a声明成static,个时候编译器提示main.c和unit2.c中的a未定义,static把unit1.c中的a定义为文件内部使用范围,unit2.c和main.c中无法访问到该变量。
把uint2.c中的声明修改成int a;
这个时候输出为
unit1.c 10
unit2.c 20
unit1.c 10
unit2.c 30
OK,结果显示unit1.c中的a和unit2.c中的a互相不影响了。再测试一下,在unit1.c中使用extern int a,看看能不能引用到unit2.c中的变量
void printtest1()
{
extern int a;
a = 10;
printf("print test at %s, variable a = %d/n", __FILE__, a);
}
这个时候输出为
unit1.c 10
unit2.c 20
unit1.c 10
unit2.c 30
可以确认unit1.c中使用的a都是本文件内定义的变量,无法影响到unit2.c中的变量了。
第三步测试结论:使用static标示的变量在文件内部有效,其他文件中无法访问。并且在该文件中无法引用到其他文件的同名称变量
第四步测试,两个文件都设置成extern
如果在unit1.c和unit2.c中都申明成extern会怎么样呢?
unit1.c
--------------------
extern int a;
void printtest1()
{
printf("print test at %s, variable a = %d/n", __FILE__, a);
}
unit2.c
-------------------
exntern int a;
void printtest2()
{
printf("print test at %s, variable a = %d/n", __FILE__, a);
}
这个时候所有使用a的地方都报编译错误,提示没有定义变量。
第四步测试结论:使用extern标示的变量必须已经定义过。
第五步,测试static标示的函数
把unit1.c中的printtest1修改成static
static void printtest1()
这时编译器报错,main.c中使用的printtest1未定义。
第5步测试结论:使用static标示的函数,在其他文件中不能访问。
原文传送门:请点击
c语言3种链接属性: 外部(external), 内部(internal),无设置(none)的更多相关文章
- 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别
链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别 大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...
- C语言作用域、链接属性和存储类型
C/C++中作用域详解 作用域 编译器可以确认的4种作用域-代码块作用域.文件作用域.函数作用域和原型作用域,一般来说,标识符(包括变量名和函数名)声明的位置决定它的作用域. (1)代码块作用域 一对 ...
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型
Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学 ...
- C语言中的作用域,链接属性和存储类型
作用域 当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域 1.代码块作用域:位于一对花括号之间 ...
- C语言链接属性总结
1.什么是链接属性? 当组成一个程序的各个源文件分别被编译后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序. 标识符的链接属性决定如何处理在不同文件中出现的标识符 ...
- C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...
- C语言链接属性
什么是链接属性 链接属性与C语言中各个目标文件及函数的链接过程有关,用于认定不同文件的标识符(即程序中定义的各种名称,包括变量名.函数名)是否是同一个实体.更通俗地说,就是在两个不同文件中的变量.函数 ...
- C和指针 第三章 链接属性 extern、internal、none
三种链接属性 组成一个程序有多个源文件,如果相同的标识符出现在多个源文件中,那么标识符的链接属性决定如何处理在不同文件中出现的标识符. 链接属性有三种: external:外部 多个源文件中的相同标识 ...
- 存储类&作用域&生命周期&链接属性
链接属性 (1)大家知道程序从源代码到最终可执行程序,经历的过程:编译.链接. (2)编译阶段就是把源代码搞成.o目标文件,目标文件里面有很多符号和代码段.数据段.bss段等分段.符号就是编程中的变量 ...
随机推荐
- RAID6三块硬盘离线导致的数据丢失恢复过程
小编我最近参与了一例非常成功的数据恢复的案例,在这里分享给大家.用户是一组6块750G磁盘的 RAID6,先后有两块磁盘离线,但维护人员在此情况下依然没有更换磁盘,所以在第三块硬盘离线后raid直接崩 ...
- PV & PVC - 每天5分钟玩转 Docker 容器技术(150)
Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. 拿前面 AWS EBS 的例子来说,要使用 Volume,Pod 必须事先知道如下信息: 当前 Volume 来自 AWS EB ...
- C#中的函数式编程:递归与纯函数(二)
在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential transparency)来定义的.如果一个 ...
- python 面向对象之封装与类与对象
封装 一,引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,小老虎一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 二,先看如何隐藏 在 ...
- 机器学习中的K-means算法的python实现
<机器学习实战>kMeans算法(K均值聚类算法) 机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行 ...
- LeetCode & 118-Pascal's Triangle-Easy
Array Description: Given numRows, generate the first numRows of Pascal's triangle. For example, give ...
- MapReduce工作机制——Word Count实例(一)
MapReduce工作机制--Word Count实例(一) MapReduce的思想是分布式计算,也就是分而治之,并行计算提高速度. 编程思想 首先,要将数据抽象为键值对的形式,map函数输入键值对 ...
- JS实现页面内跳转
使用js($.ajax中)实现页面内跳转(即:描点平滑跳转)的方法(aa为跳转目的标签的id): 在网络上有很多资料所说的:animate方法我试了并不好使,不知道是啥原因,欢迎大家指正,附上网络方法 ...
- java中类的三大特征之多态
Java 多态 同一种事物由于条件不同,展示出不同的结果,叫做多态. 父类的引用类型,由于使用不同的子类对象实例,而执行不同的操作. 多态存在的三个必要条件 1. 子类继承父类: 2. 子类重写父类方 ...
- 2.sublime设置本地远程代码同步
1.打开编辑器输入框(Ctrl+Shift+P),并执行 2.回车后输入sftp 3.回车个后,右键项目 4.修改配置信息,保存