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. R语言基础2

    ----------------------------------R语言学习与科研应用,科研作图,数据统计挖掘分析,群:719954246-------------------------- 通常, ...

  2. JAVA_SE基础——36.static的实际应用

    什么时候定义静态函数 如果功能内部没有访问到非静态数据(对象的特有数据.那么该功能就可以定义为静态) P.S. 静态方法作为类和接口的重要组成部分,可以通过类名或接口直接访问,通常将那些使用频率较高的 ...

  3. js数组string对象api常用方法

    charAt() 方法可返回指定位置的字符. stringObject.charAt(index) indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. stringObject ...

  4. Win10下, TortoiseGit安装及配合Gitee使用完整版

    Windows10下, TortoiseGit的安装及使用, 并配合Gitee码云使用! 1) 安装TortoiseGit 官网, 32位, 64位, 自选 https://tortoisegit.o ...

  5. 常用cmd代码片段及.net core打包脚本分享

    bat基础命令 注释:rem 注释~~ 输出:echo hello world 接收用户输入:%1 %2,第n个变量就用%n表示 当前脚本路径:%~dp0 当前目录路径:%cd% 设置变量:set c ...

  6. apigw鉴权分析(1-2)腾讯开放平台 - 鉴权分析

    一.访问入口 http://wiki.open.qq.com/wiki/%E8%85%BE%E8%AE%AF%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0%E7%AC%AC% ...

  7. ssm框架找不到mysql驱动类WARN DriverManagerDataSource:107 - Could not load driverClass com.mysql.jdbc.Driver

    找了很久错误,检查了配置文件,和spring配置数据源,都没有发现问题,最后上网查询了下,发现是由于配置文件后面有空格. 去除掉配置文件后面的空格就可以正常运行了.

  8. 判断ssh远程命令是否执行结束

    注:这是一个没什么鸟用的功能.不过也算是一种拓展. 通常在那些"一键化部署"的shell脚本中,可能需要使用ssh执行远程命令来实现一些简单的自动化,这些远程命令可能需要执行一段时 ...

  9. Mysql变量列表

    变量表解释 (https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html)

  10. python基础——特性(property)、静态方法(staticmethod)和类方法(classmethod)

    python基础--特性(property) 1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circl ...