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. 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别

    链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别   大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...

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

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

  3. C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型

    Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学 ...

  4. C语言中的作用域,链接属性和存储类型

    作用域 当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域 1.代码块作用域:位于一对花括号之间 ...

  5. C语言链接属性总结

    1.什么是链接属性?   当组成一个程序的各个源文件分别被编译后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序. 标识符的链接属性决定如何处理在不同文件中出现的标识符 ...

  6. C语言中变量和函数的作用域和链接属性

    C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...

  7. C语言链接属性

    什么是链接属性 链接属性与C语言中各个目标文件及函数的链接过程有关,用于认定不同文件的标识符(即程序中定义的各种名称,包括变量名.函数名)是否是同一个实体.更通俗地说,就是在两个不同文件中的变量.函数 ...

  8. C和指针 第三章 链接属性 extern、internal、none

    三种链接属性 组成一个程序有多个源文件,如果相同的标识符出现在多个源文件中,那么标识符的链接属性决定如何处理在不同文件中出现的标识符. 链接属性有三种: external:外部 多个源文件中的相同标识 ...

  9. 存储类&作用域&生命周期&链接属性

    链接属性 (1)大家知道程序从源代码到最终可执行程序,经历的过程:编译.链接. (2)编译阶段就是把源代码搞成.o目标文件,目标文件里面有很多符号和代码段.数据段.bss段等分段.符号就是编程中的变量 ...

随机推荐

  1. socket , 套接口还是套接字,傻傻分不清楚

    socket 做网络通信的朋友大都对socket这个词不会感到陌生,但是它的中文翻译是叫套接口还是套接字呢,未必大多数朋友能够分清,今天我们就来聊聊socket的中文名称. socket一词的起源 在 ...

  2. vue 内联样式style中的background

    在我们使用vue开发的时候   有很多时候我们需要用到背景图 这个时候会直接使用 内联样式 直接把你拿到的数据拼接上去 注意  在vue中直接使用style时 花括号一定别忘记 还有就是你的url一定 ...

  3. python性能分析--cProfile

    Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...

  4. MySQL/MariaDB中游标的使用

    本文目录:1.游标说明2.使用游标3.游标使用示例 1.游标说明 游标,有些地方也称为光标.它的作用是在一个结果集中逐条逐条地获取记录行并操作它们. 例如: 其中select是游标所操作的结果集,游标 ...

  5. Oracle 使用pl/sql将表中的数据读出到文件中

    (1)在服务器上创建文件路径及文件 [oracle@redhat errormsg]$ touch test01.txt (2)在数据库中创建路径及授权 (3)创建存储过程 CREATE OR REP ...

  6. OpenShift实战(三):OpenShift持久化存储Redis

    1.模板定义 修改OpenShift自带模板 [root@master1 pv]# oc edit template redis-persistent 添加如下: 2.创建PV 编辑redis pv ...

  7. Spring Security入门(3-5)Spring Security 的鉴权 - 决策管理器和投票器

    1.决策管理器的运行原理: 2.Spring Security提供的决策管理器实现 3.用户自定义的决策管理器

  8. 计算机基础,Python基础--变量以及简单的循环

    一.计算机基础 1.CPU 相当于人体的大脑,用于计算处理数据. 2.内存  用于存储数据,CPU从内存调用数据处理计算,运算速度很快. PS:问:既然在内存里的数据CPU运算速度快,为什么计算机不全 ...

  9. RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例

    之前写过一系列RxJava的文章,也承诺过会尽快有RxJava2的介绍.无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨.所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家 ...

  10. mybatis批量插入

    <insert id="insertBatch" parameterType="java.util.List" > insert into biz_ ...