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)相关推荐

  1. C语言 三种链接属性(external、internal、none)的浅析

    问题引出 当多个源文件链接在一起,我们如何处理相同名字的标识符?假设多个源文件均含有变量a,那么它的值到底采用哪个源文件定义的值呢?这就涉及到标识符的链接属性. 对象 链接属性针对标识符而言,对象通常 ...

  2. 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别...

    大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎,不要将该链接计入权重.因此多数情况下,我们可以将一些不想传递权重的链接进行nofllow处理:例如一些非本站的链接,不想传递权重,但是 ...

  3. C语言作用域、链接属性和存储类型

    C/C++中作用域详解 作用域 编译器可以确认的4种作用域-代码块作用域.文件作用域.函数作用域和原型作用域,一般来说,标识符(包括变量名和函数名)声明的位置决定它的作用域. (1)代码块作用域 一对 ...

  4. C语言标识符的链接属性

    一.定义 标识符的链接属性决定如何处理不同文件中出现的相同的标识符. 二.分类 external(外部).internal(内部)和none(无). none:标识符总是被当做个体,也就是说标识符的多 ...

  5. 【 C 】作用域、链接属性、存储类型、static 关键字简介及总结

    目录 作用域 代码块作用域 文件作用域 原型作用域 函数作用域 链接属性 存储类型 总结 作用域 当变量在程序中的某个部分被声明时,它只有在程序的一定区域才能被访问.这个区域由标识符的作用域(scop ...

  6. c语言之函数存储属性,C语言:链接属性与存储类型

    一. 链接属性 C语言中链接属性决定如何处理在不同文件中出现的标示符.标示符的作用域与它的链接属性有关,但这两个属性并不相同. 链接属性有3种: external(外部),internal(内部) 和 ...

  7. C语言之变量存储类型与链接属性

    文章出自个人博客https://knightyun.github.io/2018/04/28/c-storage-type,转载请申明 C语言中一个重要的东西就是弄清申明变量的类型.作用域.存储类型. ...

  8. c语言存储汉字的变量类型,C语言之变量存储类型与链接属性

    C语言中一个重要的东西就是弄清申明变量的类型.作用域.存储类型.链接属性等,例如是整型还是浮点型,存储于普通内存还是堆栈或者寄存器,作用于全局还是局部,能否被其他文件 引用等. 链接属性 申明变量或函 ...

  9. C语言中变量的链接属性

    当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序.如果相同的标识符出现在几个不同的源文件中时,它们是表示同一个变量还是不同的变量 ...

最新文章

  1. asp.net工程中aspx文件与codebehind文件的关联问题
  2. php中@作用,@字符在PHP中有什么作用?
  3. 【Android 安全】DEX 加密 ( 支持多 DEX 的 Android 工程结构 )
  4. 重磅!2021年考研国家线正式公布,部分学科分数线比去年更低!
  5. SpringBoot中自定义消息转化器
  6. 【BCVP】实现基于 Redis 的消息队列
  7. 理解 C++ 的 Memory Order 以及 atomic 与并发程序的关系
  8. django orm_Django ORM简介
  9. 从像素坐标到相机坐标_多视图几何基础——深入理解相机内外参数
  10. python实现池化操作
  11. 【应用赏析】Las Vegas利用ParkPad(基于ArcPad)实现公园资产管理
  12. 定向士官学计算机网络技术可以吗,山东信息职业技术学院2016年定向培养士官招生问答...
  13. matlab计算最大特征向量,MATLAB求最大特征值和特征向量
  14. C++:Sqlite调用之增、读、改
  15. 美团旅游召回系统设计
  16. IOS FaceID TouchID识别
  17. 2018.06.25 一个不知道叫什么好的U盘启动工具集
  18. 《C语言及程序设计》实践参考——学生成绩统计
  19. 2019年,实现 React 动画的 5 种最常用方式
  20. python中一个等于号和两个等于号_python中is与双等于号“==”的区别示例详解

热门文章

  1. 【BZOJ3677】[Apio2014]连珠线 换根DP
  2. NodeJS 学习记录
  3. Windows中查找文件被何进程使用
  4. asp.net 之高速缓存
  5. HDU-5532Almost Sorted Array LIS问题
  6. centos7挂载nas存储_CentOS7搭建NAS文件共享存储
  7. android 使用Binder通信
  8. 阿里云java mysql环境_阿里云搭建centos java mysql nginx环境
  9. Sqlite3_prepare
  10. C++ 11右值引用