C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性
作用域
代码块作用域: 代码块指的是使用“{}”包围起来的部分。
- 在代码块中定义的变量,代码块之外是不能访问的。
- 代码块嵌套之后的变量作用域,子代码块中定义的同名变量会覆盖父代码块中的同名变量。
#include <stdio.h>
int main(){
{
int i=0;
printf("%d\n",i);//0
{
int i=1;
printf("%d\n",i);//1
}
}
}
函数原型作用域: 函数原型作用域仅包括函数原型形式参数所在的括号。该作用于主要强调声明函数时不能使用相同名称的形式参数。
函数作用域: 函数作用域指的就是函数体的部分。K&R C的函数体不包含函数参数,所以在函数体内定义和函数参数同名变量会替代函数参数。ANSI C修改了该问题,函数参数在函数体的最外层作用域之内。
- 函数作用域内定义的变量,在函数之外不能进行访问。
文件作用域: 源文件所在的范围。
- 所有代码块之外定义的标识符就有文件作用域。(全局变量)
- 函数名不属于任何任何代码块,因此也具有文件作用域。
链接属性
- 当组成一个程序的所有源文件被编译之后,所有目标文件以及那些从一个或多个函数库中引用的函数链接在一起,组成可执行文件。问题是当相同的标识符出现在不同的源文件时该怎么办?标识符的链接属性用来处理不同源文件中出现的标识符。标识符的链接属性和它的作用域有关但并不相同。
none(无): 总是被当做单独个体,也就是说该标识符在不同源文件中的多次声明之间毫无关系,分属不同的实体。
- 代码块之内定义的变量默认具有none连接属性。通过extern修饰符可以修改为外部链接属性,这样就可以访问其他源文件中定义的外部变量了。static修饰符不能修改连接属性和作用域,只修改存储类型。
#include <stdio.h>
int main(){
{
static int i=0;
printf("%d\n",i);//0
}
printf("%d\n",i);//error: ‘i’ undeclared (first use in this function)
}
- 代码块之内定义的变量默认具有none连接属性。通过extern修饰符可以修改为外部链接属性,这样就可以访问其他源文件中定义的外部变量了。static修饰符不能修改连接属性和作用域,只修改存储类型。
internal(内部): 在同一个源文件中的所有声明指向同一实体,不同源文件指向不同实体。全局变量和函数可以通过static修饰符从外部链接属性改为内部链接属性。
external(外部):在所有源文件中指向同一实体。全局变量和函数默认具有全局作用域,可以通过extern将从未显式声明链接属性的标识符修改为外部链接属性。
- static关键字可以将全局变量和函数修改为内部连接属性。
- 全局变量默认为外部链接属性:
main.c
#include <stdio.h>
int i;
int main(){return 0;};
test.c
#include <stdio.h>
int i=0;
gcc -c main.c test.c //success
gcc -o main main.o test.o //multiple definination of "i"
main.c修改:
#include <stdio.h>
extern int i;//通过使用extern将该全局变量声明为外部链接属性,使用外部定义的变量。
int main(){return 0;}
gcc -o main main.o test.o //success
- 函数通过extern关键字修饰为全局连接属性,指的是该函数可能在其他源文件中进行定义。
main.c
#include <stdio.h>
extern int printHello();//仅指明该函数是在外部函数中声明定义。
int main(){
printHello();
return 0;
}
test.c
#include <stdio.h>
int printHello(){
printf("hello\n");
return 0;
}
C语言中变量和函数的作用域和链接属性的更多相关文章
- c语言中变量和函数作用域深究
首先,函数的作用域和访问权限基本可以参考 C语言中的作用域,链接属性和存储类型 也存在例外情况,比如内联函数 static inline,使用static 修饰 inline之后外部文件也可以访问内联 ...
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
- C语言中变量、全局变量与变量的作用域
什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...
- C语言中变量的存储类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...
- C语言中的作用域、链接属性与存储属性
C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- C语言中返回字符串函数的四种实现方法
转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...
- C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- 关于javascript中变量及函数的提升
javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...
随机推荐
- iPhone每一代的屏幕尺寸比例是多少?
参考链接: https://www.jianshu.com/p/8f566ce3bc2c https://zhidao.baidu.com/question/1668756575750668747.h ...
- 【新人填坑008】django升级2.x后报'WSGIRequest' object has no attribute 'session',
1.X 到2.x后中间件定义的名字也有所不同 改一下就好了 在setting文件中将原先的 MIDDLEWARE_CLASS 改成MIDDLEWARE 如果还运行不成功 注释掉标白线的那一行 删掉也 ...
- The Preliminary Contest for ICPC Asia Shanghai 2019
传送门 B. Light bulbs 题意: 起初\(n\)个位置状态为\(0\),\(m\)次操作,每次操作更换区间状态:\(0\)到\(1\),\(1\)到\(0\). 共有\(T,T\leq 1 ...
- webdriver浏览器版本驱动对应以及下载
对于webdriver和各个浏览器的版本的对应,我最近发现浏览器驱动的对应在selenium库的源码里都有提及,路径是:python>site-packages>selenium>w ...
- 《2018:skymind.ai 发布了一份非常全面的开源数据集》
这是一份非常全面的开源数据集,你,真的不想要吗? 近期,skymind.ai 发布了一份非常全面的开源数据集.内容包括生物识别.自然图像以及深度学习图像等数据集,现机器之心将其整理如下:(内附链接 ...
- hdu6464 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=6464 题意 一个空序列,q次操作,一种是往序列后插入x个y,另一种是查询序列中第x小到第y小的数字之和 题解 线 ...
- 实现迭代器(__next__和__iter__)
目录 一.简单示例 二.StopIteration异常版 三.模拟range 四.斐波那契数列 一.简单示例 死循环 class Foo: def __init__(self, x): self.x ...
- Java连载52-单例模式的缺点以及抽象类
一.单例模式 1.单例模式的缺点:单例模式的类型没有子类,无法被继承. 例如:下面的例子,由于父类的构造方法是私有的,所以子类中的构造方法是无法创建的,因为它是引用父类的构造方法 package co ...
- HTML连载50-伪元素选择器、清除浮动方式五
一.伪元素选择器 1.什么是伪元素选择器 伪元素选择器作用给指定标签的内容前面添加一个子元素,或者给指定标签的内容后面添加一个子元素. 2.格式: 标签名称::before{ 属性名称:值: } 给指 ...
- Zookeeper分布式锁实战
场景描述: 在线程高并发场景下,生成唯一的订单编号,如: 2017-10-14-20-52-33-01 年-月-日-时-分-秒-序号 (1)Lock锁接口 package com.zookeeper. ...