一、在Java中,全局变量的定义没有严格的位置规定
全局变量可以定义在类的最前面,也可以定义在类的最尾端,也就说一个方法可以访问在它之后定义的变量。
可以看到,第4行定义的test方法可以访问第8行定义的变量a,这是完全没有问题的。
二、在C语言中,全局变量定义的位置是有限制的
默认情况下,一个函数不可以访问在它后面定义的全局变量
在第4行定义的main函数中尝试访问第9行定义的变量a,编译器直接报错了。
解决这个错误的话,有2种办法:
第1种办法:将变量a定义在main函数的前面
这样做编译器就不会找你麻烦了。
第2种办法:在main函数前面对变量a进行提前声明
也就是让main函数知道变量a的存在就行了,至于变量a定义在哪个位置,main函数不用管。
* 完整的变量声明需要用extern关键字
第3行是对变量a进行声明,第10行是定义变量a,再次强调,声明和定义是两码事。在第6行操作的就是第10行定义的变量a。
注意:你不能省略第10行的定义,只留下第3行的声明,因为extern是用来声明一个已经定义过的变量。
三、重复定义同一个变量
* 其实,你也可以直接在main函数前面再定义一次a
看到这一幕,你可能很惊讶,但编译器是不会报错的。在这种情况下,第3行和第10行的变量a代表着同一个变量。
* 以此类推,如果我们写了无数遍全局变量int a;,它们代表的都是同一个变量。
第3到第6行、第13到第17行的变量a都代表着同一个变量。
* 还要注意的一点是,我们也可以将全局变量a声明为局部变量后再使用!!!
注意:第2、第5、第6、第10行都代表着同一个变量。其实,从第6行a的颜色(浅蓝色)都可以看出,这个a依然是个全局变量。
(这是Xcode的特性,如果在函数内部访问了全局变量,全局变量就会显示浅蓝色,如果函数内部访问的是局部变量,局部变量就显示普通的黑色。当然,不同的开发工具有不同的显示方案)
* 但是,如果你将第5行的extern去掉,那情况就完全不一样了,相信有编程经验的你都懂得这是什么情况了
第2、第10行代表着同一个全局变量,而第5、第6行则是一个局部变量,跟外面的那个全局变量没有半毛钱的关系。其实从第5、6行a的颜色(黑色)都可以看出是个局部变量。
四、不同源文件中的同名变量
前面讲到,你在一个源文件中无论写多少遍全局变量int a;,它们代表的都是同一个变量。还有一个事实,假如在另一个源文件中也有全局变量int a;,那么这两个源文件的所有全局变量int a;都代表着同一个变量。
注意:main.c和test.c中的全局变量a都代表着同一个变量。
我们可以证明一下:
首先,在test.c中定义一个函数来查看a的值
然后在main.c的第9行修改a的值为10,然后调用test.c的test函数看看test.c中a的值
控制台的输出
已经证明了一切。
* 当然,extern关键字还是适用的,比如:
和
或者是:
和
上面的两种情况下,test.c和main.c中使用的全局变量a都还是代表着同一个变量
注意了,不可以两个文件的所有全部变量a都用extern,下面的做法是错误的:
和
因为extern是用来声明一个已经定义过的变量,这两个文件都是在声明变量,没有人定义变量,在链接的时候肯定报错:
大致错误意思是:标示符a未定义
五、static关键字
但很多时候,我们并不想让源文件中的全局变量跟其他源文件共享,相当于私有的全局变量,那么你就得用static关键字来定义变量。
这样写完,test.c和main.c的变量a分别代表着不同的变量,它们是没有联系的、互不干扰的。也就是说,main.c无法访问test.c中的变量a,因此在main.c中将a修改为10后,test.c中的a依然为0。输出结果:
。
其实static还可以用来修饰局部变量,这个在《变量类型》中说过,不再阐述了。
* 因为main.c已经没有权限访问test.c中的变量a了,所以下面的写法是错误的:
和
extern是用来声明已经定义过而且能够访问的变量,虽然test.c中有定义过变量a,但是test.c中变量a的作用域是只限于test.c文件,main.c没有访问权限,所以main.c中的extern是废的。
链接的时候报错:标示符a未定义
除非main.c自己定义一个变量a,这样子extern才是有效的,不过这时候main.c和test.c中的变量a是分别代表着不同变量
六、static和extern的总结
1.extern可以用来声明一个全局变量,但是不能用来定义变量
2.默认情况下,一个全局变量是可以供多个源文件共享的,也就说,多个源文件中同名的全局变量都代表着同一个变量
3.如果在定义全局变量的时候加上static关键字,此时static的作用在于限制该全局变量的作用域,只能在定义该全局变量的文件中才能使用,跟其他源文件中的同名变量互不干扰
C语言的static和extern关键字
我的博客:www.while0.com 如果A.c要包含B.c里的一个变量或函数,则在A.c中要用extern关键字声明.注意: ①如果是包含的B.c里的函数,则在A.c里声明的时候可以不写exter ...
转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
static 和extern关键字
static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话 ...
浅谈C/C++中的static和extern关键字
static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话 ...
static 和 final 关键字 对实例变量赋初始值的影响
static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的 ...
15-static和extern关键字1-对函数的作用
一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...
static和extern关键字 对函数的作用
本文目录 • 一.extern与函数 • 二.static与函数 • 三.static.extern与函数的总结说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...
static和extern关键字 对变量的作用
本文目录 • 一.在Java中,全局变量的定义没有严格的位置规定 • 二.在C语言中,全局变量定义的位置是有限制的 • 三.重复定义同一个变量 • 四.不同源文件中的同名变量 • 五.static关键 ...
【C语言】19-static和extern关键字1-对函数的作用
一.extern与函数 在前面我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.o ...
c/c++中static与extern关键字介绍
一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的 ...
随机推荐
ABP理论学习之N层架构
返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...
Lucene-Analyzer
Lucene文本解析器实现 把一段文本信息拆分成多个分词,我们都知道搜索引擎是通过分词检索的,文本解析器的好坏直接决定了搜索的精度和搜索的速度. 1.简单的Demo private static fi ...
Change An Item Property Using Set_Item_Property In Oracle Forms
Set_Item_Property is used to change an object's settings at run time. Note that in some cases you ca ...
onActivityResult调用不到的问题
有可能是调用时机不对,请转移到: http://www.cnblogs.com/shaweng/p/3875825.html 还有可能是Activity的launchmode导致的 使用 androi ...
[Twisted] 事件驱动模型
在事件驱动编程中,多个任务交替执行,并且在单一线程控制下进行.当执行I/O或者其他耗时操作时,回调函数会被注册到事件循环. 当I/O完成时,执行回调.回调函数描述了在事件完成之后,如何处理事件.事件循 ...
UVa 10616 - Divisible Group Sums
称号:给你n数字.免去m一个,这使得他们可分割d.问:有多少种借贷. 分析:dp,D01背包. 背包整数分区. 首先.整点d.则全部数字均在整数区间[0,d)上: 然后,确定背包容量,最大为20*10 ...
【原创】Ionic单页应用跳转外链,构造路由返回的解决办法及代码
在开发广汽菲克微信企业号的填单审批webApp的时候出现了一个问题: 单据是带有附件的,而且存在各种不同的格式,需要后台处理后给前台链接地址,点击预览,微信浏览器的特性就是只能存在一个浏览器窗口, 这 ...
windows查看进程信息
wmic process where caption="java.exe" get processid,caption,commandline /value
漫谈数组去重复方法(亮点是ES6的新API)
方法1: 利用遍历的思想来进行.
2017蓝桥杯 省赛D题(方格分割)
6x6的方格,沿着格子的边线剪开成两部分.要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算:包括这3种分法在内,一共有多少种不同的分割 ...