C/C++中auto、static、register、extern关键字区别小结

来源:互联网 发布:python股票交易系统 编辑:程序博客网 时间:2024/06/06 19:43

1. 说明

  以上四种都是变量存储说明符,因为C/C++语言在变量定义时候的完整语法是:
     [存储说明符] [数据类型] [变量名称] [=初始化];
  因为大多我们声明的变量都是auto变量,而存储说明符默认即auto关键字,所以大多情况下我们省略了auto关键字。例如:
  int nNum = 5;
  实际定义的完整变量语句为:
  auto int nNum =5;
  下面我们简单谈谈这四种关键字的区别。

2. 区别

  ①. auto自动变量:表明变量自动具有本地范围,在离开作用域,无论块作用域,文件作用域还是函数作用域,变量都会被程序隐藏或自动释放。然后等你重新进入该作用域,变量又重新被定义和调用。使用auto变量优势是无需考虑变量是否被释放。
  ②. static静态变量:简单说就是在函数等调用结束后,该变量也不会被释放,保存的值还保留。即它的生存期是永久的,直到程序运行结束,系统才会释放,但也无需手动释放。
  ③. register寄存器型变量:这个关键字要求编译器尽可能的将变量存储在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。但是这只是给系统的一个暗示,如果寄存器资源有限,系统也不会满足你的要求。register型变量存取速度比内存快很多,一般你在一些系统库文件,或诸如单片机官方接口库中使用较多,正常我们能用上较少。
  ④. extern外部变量:它属于变量声明,extern int a和int a的区别就是,前者告诉编译器,有一个int类型的变量a定义在其他地方,如果有调用请去其他文件中查找定义。

3. 总结和注意点

  ①. 关于extern变量声明使用,例如一个工程中:
    Test1.cpp文件开头定义了int i =10; //定义了一个全局变量
    Test2.cpp文件中定义:extern int i; //声明在另一个编译单元有i变量
注意:不可以写成extern int i =10,因为变量已经存在,不可以在声明时候赋初始值。
  ②. 关于static和extern注意地方:
  static静态变量虽然和整个程序共生存期,但是作用域还是需要看其定义的地方,当你在某个函数中定义一个变量,该变量作用域仅在该函数中。但你在文件开头定义一个全局变量,该变量作用域仅在该文件中。所以当你声明一个变量调用另一个文件静态变量,编译器会报错的。
  ③. extern声明尽量写在头文件中:
  我们知道头文件只要是存放函数和变量声明的,所以用extern声明的变量也尽量写在头文件中,如果写在cpp文件中容易埋下苦果。
  ④. 寄存器型变量快的原理:
  CPU处理数据的过程是这样,数据是存放在内存当中,CPU从内存里面读取数据先要存放到寄存器中,然后CPU再从寄存器里读取数据来处理。处理完后同样把数据通过寄存器存放到内存里,也就是说CPU和内存数据交换之间存在一个寄存器,并不直接打交道。所以如果我们能够直接将数据存放在寄存器中,CPU存取数据就将快的多。


个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高考考生号忘了怎么办 1岁宝宝吞了硬币怎么办 小孩吞了5角硬币怎么办 10小孩吞了硬币怎么办 小孩吞了5毛硬币怎么办 小孩把硬币吞了怎么办 高三数学成绩差怎么办 没交社保的工龄怎么办 购置税证明丢了怎么办 车登记证书丢了怎么办 车辆登记书丢了怎么办 车贷分期还完了怎么办 住宅70年到期后怎么办 在外地扣了12分怎么办 英语6级证书丢了怎么办 孩子腺样体肥大鼻子堵塞怎么办 孩子初中成绩太差怎么办 交违章罚单丢了怎么办 违章缴费单丢了,怎么办 违章处理单掉了怎么办 驾驶证被扣9分后怎么办 车子违章扣50分怎么办 车子扣了12分怎么办 大学把档案丢了怎么办 学校把档案丢了怎么办 高考考了200多分怎么办 高考报名号忘了怎么办 中考只考500分怎么办 档案自提了之后怎么办 冬天衣服上的毛怎么办 四维预约不上怎么办 交了订金后悔了怎么办 信而富认证失败怎么办 南京市民卡坏了怎么办 南京市民卡断了怎么办 义乌市民卡丢了怎么办 常熟市民卡丢了怎么办 昆山市民卡丢了怎么办 市民卡丢了看病怎么办 儿童市民卡丢了怎么办 眉毛纹的太黑怎么办