关闭

【VS开发】static、extern分析总结

432人阅读 评论(0) 收藏 举报
分类:

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7396325

       对于写了很多小程序的人,可能static和extern都用的很少,因为static和extern通常在工程量很大时候才能体现优势很必要性,这就不奇怪linux内核代码中“泛滥”着这两个关键词,而且据我所知,这也是面试经常被问道的,因为这涉及到的底层多一点。下面,就我自己总结的几点简要谈谈:

一、c语言内存空间布局

      下面是google上找的一张c内存布局图,我先基于这张图介绍下各个内存区域的情况

1、正文(代码段):每个程序开始前,都有系统加载代码指令到这里,用于执行,当然都是机器码

2、初始化的数据段:存放已经初始化的非自动变量,如全局变量int i=0;等等

3、未初始化的数据段(BSS):存放未初始化的非自动变量,如全局变量int i;等等

4、堆:动态申请的区域,如malloc、calloc、realloc等产生的

5、栈:自动变量或函数调用信息保存的区域,如局部变量int i;等等

二、extern关键词

      这个关键词是用来申明时告诉编译器,这个变量或函数等可以在别的文件里定义,而且可以申明多次,但是定义只能一次。这样的好处就是多个文件可以共用一个量。这里要强调一点,我想不明白为什么这么多人理解错了,就是:用#include进来的文件和本文件不算两个文件,因为include预处理的时候就把代码直接加进来了,所以还是一个文件,即使你在一个文件里申明一个变量前加了static(见下面详细说明),然后用include包含进来,在本文件也是可以用的!我所说的extern可以使变量在不同文件共享,两者没有什么包含关系,是独立的,可以共用变量是靠编译器链接功能实现的。继续,当然,不是所有的全局都要extern修饰,函数申明的时候自动是extern的,这点也要注意。

三、static关键词

      这个关键词是静态的意思,顾名思义,其实这根extern感觉就是水火两重天了,它修饰变量只能在本文件可用,而且是静态的,不会因为作用域的结束而消亡(但是只能在作用域内用哈~,也就是static不改变变量的作用域)。这就带来了些好处,如果两个文件用了相同的变量名的变量或者函数名一样的函数,只要加了static就不会冲突;局部变量加了static还有个常用的功能就是函数调用次数的计数。关于static我在另一篇文章中也提到了,可以看看:用GCC输出带源代码的汇编程序进行链接的调试

     最后,extern和static变量都是放在2、3所表示的区域,两者还有个区别就是static你只能申明一次,为什么?很显然,因为由它修饰的变量只能在本文件使用,故你如果申明时不初始化它自己会初始化自己为0,所以通常申明static时很多时候没有认为初始化。可能还有人认为我说漏了auto和regester两个修饰词,这两个通常有编译器自动识别,编译器至少这这一方面干的比你出色~

0
0
查看评论

static、extern分析总结

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7396325        对于写了很多小程序的人,可能static和extern都用的很少,因为static和extern...
  • int64Ago
  • int64Ago
  • 2012-03-26 20:33
  • 7262

CONST,STATIC,EXTERN用法总结!

最近看许多公司笔试都考这几方面的内容,于是乎就搜索了一下,把这几个知识点总结以下,以增强基础,以及应付未来的笔试+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------CON...
  • adriano119
  • adriano119
  • 2008-09-28 11:13
  • 5512

C语言关键字 - 乱世枭雄:static与extern

++++++++++++++++++++++++++++++++++++++++++ 《C语言深入理解系列 - 乱世枭雄:static与extern》 查看其它博文请关注原创作者。 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_rap...
  • mr_raptor
  • mr_raptor
  • 2012-01-19 17:16
  • 4110

C语言 static和extern关键字 对变量的作用

上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问;extern用来定义和声明一个外部函数,允许其他文件访问。static和extern对变量也有作用,不过跟函数有点差别。   C语言和Java都有全局变量的概念,但是它们的用法还是...
  • VNanyesheshou
  • VNanyesheshou
  • 2016-01-11 13:27
  • 2361

C/C++中static和extern小结

static和extern是C/C++中和函数的声明有关的两个关键字,特别是涉及到全局变量时,所以做此总结。1. static关键字1.1 函数和变量声明(C/C++) static全局变量:当声明一个static全局变量,则表示静态全局变量,和其他变量一样,存放在.data(初始化了)或者.bss...
  • GVFDBDF
  • GVFDBDF
  • 2016-07-02 17:05
  • 868

const,static,extern 的理解

static 修饰局部变量 让局部变量只初始化一次局部变量在程序中只有一份内存并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁) 修饰全局变量 全局变量的作用域仅限于当前文件 const 没有const修饰的指针 指针p和*p都能被修...
  • chen_gp_x
  • chen_gp_x
  • 2016-11-13 16:27
  • 21557

static extern const 静态全局变量与全局变量的区别

static:和extern是用来设置作用域的 const:设置变量只可以被读,不可以被修改static:用static修饰的变量,在其所限定的作用域中只会有一分内存1:在一个函数内部:说明是一个静态局部变量, 不管这个函数被调用多少次,这个static修饰的变量只会有一分内存,也就是说当这个...
  • li15809284891
  • li15809284891
  • 2017-02-08 09:54
  • 1527

C语言学习入门 (七) 变量与函数,static和extern关键字

局部变量 1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。 2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。 全局变量 1> 定义:在所有函数外部定义的变量,称为...
  • jjwwmlp456
  • jjwwmlp456
  • 2014-12-03 18:22
  • 1171

C# 关键字extern用法

修饰符用于声明在外部实现的方法。extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 属性一起使用;在这种情况下,该方法还必须声明为 static,如下面的示例所示:[DllImport("avifil32.dll")]private...
  • llddyy123wq
  • llddyy123wq
  • 2010-05-24 16:48
  • 21158

局部变量和全局变量,extern和static

局部变量和全局变量,extern和static
  • zhang_yin_liang
  • zhang_yin_liang
  • 2016-07-24 19:34
  • 531
    个人资料
    • 访问:1909225次
    • 积分:22323
    • 等级:
    • 排名:第388名
    • 原创:271篇
    • 转载:947篇
    • 译文:3篇
    • 评论:192条
    博客专栏
    最新评论