C语言中volatile/register/const/static/extern/auto关键字的作用

这篇具有很好参考价值的文章主要介绍了C语言中volatile/register/const/static/extern/auto关键字的作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、volatile

二、register详解

三、const详解

四、static详解

五、extern详解

语法

作用

六、auto详解


突然想总结一下这些关键字的作用,灵活使用这些对程序的可靠性和速率都有提高

一、volatile

volatile是防止编译器优化,如果是高频繁的变量编译器会自动将变量放到寄存器中,但是有的变量需要实时更新不能间断,放到寄存器中会隔一段时间再去获取变量,导致变量的值不在准确。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错

下面是使用volatile变量的几个场景:

1>中断服务程序中修改的供其它程序检测的变量需要加volatile;

2>多任务环境下各任务间共享的标志应该加volatile;

3>存储器映射的硬件寄存器通常也要加voliate,因为每次对它的读写都可能有不同意义。

eg: volatile  int *output=(volatile unsigned int *)0xff800000;//定义一个I/O端口

二、register详解

寄存器变量就是把使用高频繁的一个变量 系统会将内存中高频繁的变量放入到寄存器中。

作用:用register关键字修饰变量,就是编译程序时希望把该变量放到寄存器中,这样可以提高对该变量的访问速度。由前言可知,CPU访问寄存器的速度是高于访问内存的速度

下面是使用register变量的场景和注意事项:

  • 适用于不需要经常修改,但是会被频繁访问的变量,这样可以一定程度上提高访问效率。
  • 变量需要写入寄存器而不在内存中,所以利用&取址运算符是无法获取地址的,即,&取址运算符不能用于register修饰的变量。
  • register变量必须是能被CPU所接受的类型。变量保存在寄存器中,那表示变量的程度不能超过寄存器的位数并且类型要和寄存器接受的数据类型一致。通常情况register修饰的变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。如果寄存器允许存放浮点数,那register修饰的变量也可以是浮点数。
  • 局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c。我猜测原因是:静态变量的生命周期和整个程序的生命周期是一样的,总不能分配一个寄存器一直被一个变量占用,寄存器资源是很宝贵的,这样太浪费。一般都是用来修饰局部变量
  • 不能定义任意多个寄存器变量,原因很简单Soc的寄存器太少了。就算你用register修饰都不一定会放在寄存器中,更别说还要定义多个。

三、const详解

被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。

(1)可以定义常量

const int a=100;

(2)类型检查

const常量与#define宏定义常量的区别:const常量具有类型,编译器可以进行安全检查;#define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查。

(3)防止修改,起保护作用,增加程序健壮性

void f(const int i){
    i++; //error!
}


(4)可以节省空间,避免不必要的内存分配

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
这里写的非常清楚,我这里就不加累述了

C语言|const的使用_const在c语言中的用法-CSDN博客

C++ const的用法详解_c++ const用法-CSDN博客

四、static详解

【C语言】 Static关键字的用法和详解(太细了!!!)_static在c语言中的用法-CSDN博客

详细说明: 

  • 变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 
  • 变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 
  • static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长。
  • 当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。

使用注意: 
    1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; 
    2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; 
    3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。

五、extern详解

extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。

语法

extern放在变量和函数声明之前,表示该变量或者函数在别的文件中已经定义,提示编译器在编译时要从别的文件中寻找。除此之外,extern还可以用来进行链接指定。

作用

  1. 声明外部变量
    在声明全局变量时,不同的文件在编译器编译时是不透明的,比如在A.c中定义int i,同时在B.c中定义int i,编译器编译时是不会报错的,但是当链接linking时会报错重复定义。当需要使用同一全局变量时,如:在A.c中定义了int i,在B.c中需要调用i,只需要在B.c中声明extern int i,表示该变量在别的文件中已经定义,编译时便不会出错,在linking…的时候会自动去查找定义过的变量i。
  2. extern函数声明
    extern void fun()暗示该函数可能在别的文件中定义过,它和定义为void fun(),没什么区别,其用处在于复杂的项目用通过在函数前添加extern声明来取代用include" *.h"来声明函数。
  3. 单方面修改函数原型
    当声明extern void fun(int i,int j,int k)时,在之后的调用中如果按照是fun(x,y,z)的原型调用时是没有问题的,但是如果要对该函数进行修改比如输入参数,调用时为fun(x,y)此时编译器就会报错了,解决办法就是去掉extern,该头文件中声明void fun(int i,int j),并对该函数进行修改,之后在调用的文件中包含该函数所在的头文件" *.h"即可。

六、auto详解

这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。文章来源地址https://www.toymoban.com/news/detail-727574.html

到了这里,关于C语言中volatile/register/const/static/extern/auto关键字的作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • extern\const\static的使用详解

    1.extern 利用extern,可以在一个文件中引用另一个文件中定义的变量或者函数, extern  可以应用于全局变量、函数或模板声明。   extern  具有四种含义,具体取决于上下文: 在非  const  全局变量声明中, extern  指定变量或函数在另一个转换单元中定义。 必须在

    2024年02月01日
    浏览(23)
  • 详解const、static关键字

    目录   一、static 二、const 在c语言中: static是用来修饰变量和函数的         1.修饰局部变量——称为静态局部变量         2.修饰全局变量——称为静态全局变量         3.修饰函数——称为静态函数 有关内存相关知识补充: 程序的所有数据,也就是所有的

    2024年02月06日
    浏览(38)
  • 重学C++系列之const与static关键字分析

            本篇幅讲解const与static,主要围绕在类的范围内叙述,包括作用和使用场景等。         1、const修饰的成员变量,成员变量初始化后不能再修改。         2、const修饰的成员函数,成员函数不可以修改成员变量,也不能间接修改。         3、static修饰的成员

    2024年02月15日
    浏览(38)
  • 【C++】const、static关键字和构造函数初始化

    💗个人主页💗 ⭐个人专栏——C++学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 1. const修饰成员函数 1.1 语法格式 1.2 权限放大缩小 1.3 思考 1.4 解答 2. 再谈构造函数 2.1 构造函数体赋值 2.2 初始化列表 2.3 explicit 3. static成员 3.1 静态变量 3.2 静态函数 3.3 静态成员变量

    2024年02月19日
    浏览(38)
  • 关于c++中mutable、const、volatile这三个关键字及对应c++与汇编示例源码

    这哥三之间的关系是有趣的,不妨看看这个: cv (const and volatile) type qualifiers - cppreference.com permits modification of the class member declared mutable even if the containing object is declared const. 即便一个对象是const的,它内部的成员变量如果被mutable修饰,则此成员变量依旧可以被修改。 很常见,

    2024年02月13日
    浏览(26)
  • C++面试八股文:static和const的关键字有哪些用法?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第7面: 面试官:C++中, static 和 const 的有哪些用法? 二师兄: satic 主要用在以下三个方面:1.用在全局作用域,修饰的变量或者函数为静态的,限制在本文件内使用。2.方法内修饰修饰静态局部变量,在第一次访问

    2024年02月08日
    浏览(37)
  • 在C++和C中static关键字的用法,在C++和C中const关键字的用法

    1、在C++和C中static的用法 答:static表示存储类型,修饰数据类型。在C语言中,static修饰局部变量,内存分配在静态区,生命周期延长,作用域不变。static修饰全局变量,内存分配在静态区,作用域被局限于本文件,不能被extern引用。static修饰函数,不能被exter

    2024年02月10日
    浏览(30)
  • C语言volatile关键字

    在C语言中, volatile 是一个类型修饰符,用于告诉编译器对象的值可能会在编译器无法检测到的情况下被改变。这通常发生在以下两种情况: 硬件的输入/输出操作,例如一个设备寄存器的读取或写入。 共享内存的并行程序,其中一个线程修改了一个内存位置,而另一个线程

    2024年02月07日
    浏览(38)
  • C++语言深度解析--类型系统和类型安全--const和volatile

    目录 1.1类型系统和类型安全 类型系统 类型安全 c++和c的差别 面试题 1.2const和volatile 面试题 1.1类型系统和类型安全 类型系统 类型系统是一门编程语言最核心也是最基础的部分。一门计算机语言无论基于何种编程范式,都必须首先对类型系统做出明确的定义。 数据类型:一个

    2024年02月09日
    浏览(31)
  • C语言-外部关键字extern

    extern  extern 用在全局变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。  什么是定义,什么是声明?       什么是定义:所谓的定义就是为这个变量分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名。但注意,这个名

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包