当前位置:网站首页 > 技术博客 > 正文

c 语言关键字



  在阅读意法官方给的固件库的工程中的时候偶然看见了修饰的变量然后发现其实这是固件库中的宏定义关键字,其实它是关键字,本篇博客用于整理和其相关资料。

 
  

   影响编译器编译的结果, 变量是随时可能发生变化的,与变量有关的运算,不要进行编译优化,以免出错。

一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;


例如:

 
   

   告诉编译器i是随时可能发生变化的,每次使用它的时候必须从的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。而如果没有关键字编译器的做法是,由于编译器发现两次从读数据的代码之间的代码没有对进行过操作,它会自动把上次读的数据放在中。而不是重新从里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说可以保证对特殊地址的稳定访问,不会出错。


  以下内容来自https://blog.csdn.net/_/article/details/我认为对理解用途有帮助就分享给大家。

  我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、等等打交道,所有这些都要求用到 变量。不懂得的内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是真的懂得完全的重要性。
  1) 一个参数既可以是还可以是吗?解释为什么。
  2) 一个指针可以是吗?解释为什么。
  3) 下面的函数有什么错误:


 
    

答:
  1) 是的。一个例子是只读的状态寄存器。它是因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
  2) 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
  3) 这段代码有点变态。这段代码的目的是用来返指针指向值的平方,但是,由于指向一个型参数,编译器将产生类似下面的代码:


 
    

  由于的值可能被意想不到地该变,因此和可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

 
    

  是只读变量,即变量保存在只读静态存储区。编译时,如何尝试修改只读变量,则编译器提示出错,就能防止误修改(这个关键字就不多说了,不了解的可以戳这里)。


  前面介绍了 volatile 和 const 的用法,不知道大家了解了没?了解了后,下面的讲解就更加容易了:
   :输入口。既然是输入,那么寄存器的值就随时会外部修改,那就不能进行优化,每次都要重新从寄存器中读取。也不能写,即只读,不然就不是输入而是输出了。
   :输出口,也不能进行优化,不然你连续两次输出相同值,编译器认为没改变,就忽略了后面那一次输出,假如外部在两次输出中间修改了值,那就影响输出
  :输入输出口,同上


版权声明


相关文章:

  • 最大似然估计基本原理2025-09-24 13:30:02
  • centos72025-09-24 13:30:02
  • green软件怎么使用2025-09-24 13:30:02
  • 硬盘搜索软件2025-09-24 13:30:02
  • java几种引用类型使用场景2025-09-24 13:30:02
  • urllib库官方文档2025-09-24 13:30:02
  • vs2010怎么下载与安装2025-09-24 13:30:02
  • 大小端的区别以及各自的优点,哪种时候用2025-09-24 13:30:02
  • 进程和线程详解2025-09-24 13:30:02
  • java内部类使用外部类属性2025-09-24 13:30:02