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段等分段.符号就是编程中的变量 ...
随机推荐
- nyoj 擅长排列的小名II
擅长排列的小明 II 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个 ...
- 第一章 创建WEB项目
第一章 创建WEB项目 一.Eclipse创建WEB项目 方法/步骤1 首先,你要先打开Eclipse软件,打开后在工具栏依次点击[File]>>>[New]>>&g ...
- 扩展Microsoft Graph数据结构 - 架构扩展
前言 此前我有一篇 文章 讲解了Microsoft Graph的一种数据扩展技术-- 开发扩展(Open Extensions),它可以实现在支持的对象(例如用户,组等)上面附加任意的数据.但开放扩展 ...
- python网络爬虫与信息提取 学习笔记day1
Day1: 安装python之后,为其配置requests第三方库,并爬取百度主页内容. 语句解释: r.status_code检测请求的状态码,如果状态码为200,则说明访问成功,否则,则说明访问失 ...
- 【52ABP实战教程】0.2-- VSTS中的账号迁移到东亚
需求从哪里来! VSTS的全称是Visual Studio Team Services. 在上一篇的文章中已经给大家说了VSTS之前是没有香港节点.大家的访问速度回比较慢.但是11月10号微软就宣布开 ...
- Extensions in UWP Community Toolkit - Mouse Cursor
概述 UWP Community Toolkit Extensions 中有一个为 Mouse 提供的扩展 - Mouse Cursor Extensions,本篇我们结合代码详细讲解 Mouse C ...
- MySQLdb、 flask-MySQLdb 、MySQL-python 安装失败
今天在学习flask的时候,学习到数据库部分,连接mysql生成表,运行程序报错误:No module named MySQLdb 此时 需要安装 以下两个中任何一个 pip install flas ...
- Java调用SQL脚本执行的方案
在Java中调用SQL脚本的方式有多种,在这里只记录一种自己常用的方式,个人觉得挺实用方便的. 运用ScriptRunner这个类. import org.apache.ibatis.io.Resou ...
- scrapy选择器主要用法
# 命令行输入:scrapy shell +链接,会自动请求url,得到的相应默认为response,开启命令行交互模式 scrapy shell http://doc.scrapy.org/en/l ...
- html学习之多行文本
代码如下: <body> <form action="post"> <!--wrap设置多行文本是否自动换行--> <textarea n ...