C语言中的static和extern
c语言中,全局变量是一个非常重要的概念。全局变量定义在函数外,可以被所有的函数共同使用。
#include <iostream> ; void display() { printf("%d", x); x++; printf("\n"); } int main(int argc, char* argv[]) { display(); printf("%d", x); printf("\n"); system("pause"); }
上述例子中 int x = 10; 是对一个全局变量的定义,他的作用域是从定义的位置开始一直到文件的末尾。
当然,针对全局变量而言,我们没必要非要将他定义在文件的开始的位置,要在定义之前使用它,那么就需要声明。对比上述代码,也可以这么写:
#include <iostream> void display() { extern int x; printf("%d", x); x++; printf("\n"); } extern int x; int main(int argc, char* argv[]) { display(); printf("%d", x); printf("\n"); system("pause"); } ;
上例中,第一个extern int x; x的作用域是从声明开始到display函数结束,而第二个extern int x 的作用域是从声明开始到文件结束。当然,即便你重复声明一个变量也不要紧,只要声明了就可以用,而所用的x都是在下边定义的那个全局变量x。c编译的原则是可以随便多次声明但是绝不可以多次定义。
extern关键字的作用远不止单个文件这么简单。我们创建另一个源文件,只有一行代码:
;
此时我们将两个文件同时编译,果断出错了。理由很简单:x被重定义,当你使用x这个全局变量的时候,将不知道会使用哪个。即便你将声明用的extern关键字去掉也无济于事。
这就说明上述全局变量的定义是贯穿整个工程的,那么当工程庞大的时候,很有可能就会需要不同文件下有相同的全局变量名称。这个时候static关键字的作用就来了。
我们在新建的源文件定义x的时候前边加上static关键字:
;
然后编译就能通过了。因为static的作用是所在的文件中才会使用定义的全局变量。此时我们修改新文件:
#include <iostream> extern int x; void display2() { printf("%d", x); printf("2\n"); } ;
然后我们在另一个源文件调用这个display2,因为是全局函数,所以调用前和变量一样声明一下就好了:
int main(int argc, char* argv[]) { extern void display2(); display2(); printf("%d", x); printf("\n"); system("pause"); }
我们发现display2打印的是20,和main所在文件中的x是两个x。
C语言中的static和extern的更多相关文章
- C语言中:static与extern对变量和函数的作用
1.两者对全局变量 static对全局变量,表示定义一个内部变量 extern对全局变量,表示声明一个外部变量 说明: 1.内部变量:定义的变量只能在本文件中访问,不能被其他文件访问. 2.不同文件中 ...
- C语言中的static的作用?
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)第一个作用:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话 ...
- 转:C语言中的static变量和C++静态数据成员(static member)
转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量 a.静态局部变量在函数内定义,生存期为整个程序 ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- C语言中的static 具体分析
google了近三页的关于C语言中static的内容,发现可用的信息非常少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的刚開始学习的人来说參考性不是非常大.所以,我这篇博文博採众 ...
- C语言中的static关键字
C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互 ...
- 【转载】C语言中的static 详细分析
原blog地址:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少, ...
- [整理]C语言中的static静态对象
1.说明外部对象(静态外部变量和静态函数) (1)static 用于说明外部变量或函数,使该对象的作用域限定为被编译原文件的剩余部分,即从对象说明开始到所在源文件的结束部分: (2)被st ...
- C语言中,static关键字作用
static修饰变量 1 在块中使用static修饰变量 它具有静态存储持续时间.块范围和无链接. 即作用域只能在块中,无法被块外的程序调用:变量在程序加载时创建,在程序终止时结束. 它只在编译时初始 ...
随机推荐
- 【转】Pro Android学习笔记(四):了解Android资源(下)
处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...
- AI-Info-Micron-Insight:在线购物算法的核心是强大的 DRAM
ylbtech-AI-Info-Micron-Insight:在线购物算法的核心是强大的 DRAM 1.返回顶部 1. 在线购物算法的核心是强大的 DRAM 网购已成为标准程序.你滚动浏览各种服装页面 ...
- NLB
http://www.cnblogs.com/allegro/archive/2011/02/11/1951171.html
- React库protypes属性
Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (validator) 来验证传入数据的有效性.当向 ...
- 【机器学习】支持向量机SVM
关于支持向量机SVM,这里也只是简单地作个要点梳理,尤其是要注意的是SVM的SMO优化算法.核函数的选择以及参数调整.在此不作过多阐述,单从应用层面来讲,重点在于如何使用libsvm,但对其原理算法要 ...
- PHP判断用户是手机端?还是浏览器端访问?
function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ' ...
- 实训随笔2:Git Gui——拯救菜鸟的工具
熟练使用git进行多人协作开发,是程序猿必备的专业技能之一,可惜我等实在太菜搞不来复杂的命令行. 幸好除了Git Bash还有一个Git gui存在——专门为了拯救我们这些菜鸡程序猿而存在的工具. 下 ...
- WordPress博客搭建指南
WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统.WordPress具有插件架构和模板系统.Alexa排行前100万的网站中有超过16.7%的网站使用WordPre ...
- Unity 5.6中的混合光照(下)
https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...
- UIPI VS与Win7 共舞:用户界面特权隔离
http://tech.it168.com/a2009/0924/737/000000737968.shtml [IT168 专稿]在上文中,我们介绍了操作系统服务的Session 0隔离,通过Ses ...