volatile与const同时使用应注意的问题(转载)

“volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。因此,它们本来就不是矛盾的

const和volatile放在一起的意义在于:

(1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;

(2)另一个程序段则完全有可能修改,因此编译器最好不要做太激进的优化。

“const”含义是“请做为常量使用”,而并非“放心吧,那肯定是个常量”。

“volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。

因此,它们本来就不是矛盾的。const修饰的变量不允许这里修改不代表不允许别处修改,比如:

int i = 5;
const int* p = &i;
*p = 6; // 不可以;
i = 7; // 完全可以,而且那个“const”的“*p”也跟着变成了7。

  

对于非指针非引用的变量,const volatile同时修饰的意义确实不大。

需要明白“volatile”的含义并非是“non-const”。所以他们才可以放在一起。

在C++语言中,const没有反义词,如果一个变量没有const修饰,那它本身就是const的反义词,而并非加上volatile才是const的反义词。

两者同时修饰一个对象的典型情况,是用于驱动中访问外部设备的只读寄存器。

留一个问题:const volatile int i=10;这行代码有没有问题?如果没有,那 i 到底是什么 属性?

回答一:没有问题,例如只读的状态寄存器。它是volatile,因为它可能被意想不到地改变;它是const,因为程序不应该试图去修改它。volatile和const并不矛盾,只是控制的范围不一样,一个在程序本身之外,另一个是程序本身。

回答二:没问题,const和volatile这两个类型限定符不矛盾。const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误。volatile表示“易变的”,即在运行期对象可能在当前程序上下文的控制流以外被修改(例如多线程中被其它线程修改;对象所在的存储器可能被多个硬件设备随机修改等情况):被volatile修饰的对象,编译器不会对这个对象的操作进行优化。一个对象可以同时被const和volatile修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文意外的情况修改。另外,LS错误,const可以修饰左值,修饰的对象本身也可以作为左值(例如数组)。

来自为知笔记(Wiz)

时间: 2024-10-14 19:22:22

volatile与const同时使用应注意的问题(转载)的相关文章

volatile与const综合分析

在C/C++ 编程中,volatile与const关键字一向容易让人困惑,当然,新手可能从来不用,但是 在高质量和稳健的程序中,这两个关键字 是相当重要的. 相比const,volatile关键字的发展(变化)较少,从C到C++的演变中,一直保持着 它的语义,因此,我们先从volatile来了解下,这两个关键字 一.volatile 1.volatile 的基础 认知: volatile 的英文 释义是 容易 挥发的, 作为 关键字,可以 记忆为 它修饰的 变量 是 不稳定的,可能被其他地方的某

volatile和const

volatile可理解为"编译器警告指示字" volatile用于告诉编译器必须每次去内存中取变量值 volatile主要修饰可能被多个线程访问的变量 volatile也可以修饰可能被未知因数更改的变量 const和volatile放在一起的意义在于: (1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心:(2)另一个程序段则完全有可能修改,因此编译器最好不要做太激进的优化. "const"含义是"请做为常量使用

volatile 和const 变量的使用

一.volatile定义: 一个定义为volatile的变量是说这变量可能会被意想不到的被改变,这样,有了volatile变量后,就提醒编译器就不会去假设这个变量的值了.精确地说就是,编译中的优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份. eg: 1.硬件设备的寄存器(如:状态寄存器) #define GPFCON (*(volatile unsigned long *)0x56000050) 2.一个中断服务子程序中会访问到的非自动变量(Non-a

c++ const常量的实现机制(转载)

const关键字的基本思想就是将一个变量变成常量,试图从语言设计者的角度去分析引入该关键字的动机. 我猜测原因如下: 1)提醒程序员,某些值是常量,如PI.或该值在程序运行期间是不变的,防止程序员误修改.对于多模块开发,头文件引用复杂的系统来说,这是很重要的,如果不能在编译期阻止常量被误修改,那么这些修改将引起运行时调试困难的问题. 2)改进c语言中的#define预处理宏,1)中提到的问题使用#define宏也能够得到解决,但是#define宏作为解决方案存在一些缺陷:a)#define宏会产

软件源代码与目标代码应区别保护(转载新闻)

正如美国微软公司的新任首席执行官塞亚·纳德拉所言:“当今世界是由软件所驱动的”,软件的重要性毋庸赘言,我国将软件纳入著作权法保护已有23年, 但至今软件的法律定义与法律保护仍很模糊.我国现行<计算机软件保护条例>将同一计算机程序的源程序与目标程序视为同一作品,然而源程序与目标程序的本质 属性并不相同,条例中的谬误会对软件的保护产生不利影响.因此,我国有必要重新审视软件的法律本质从而完善软件的法律保护制度,或对软件另行制定特别法来保护与规制. 本文经阐述软件著作权保护的冲突根源,指出现行<

引入CSS的方式有哪些?link和@import的有何区别应如何选择【转载】

看到淘宝网页中这样写使用的是import,而很多网站都是使用link,当然还有一些页面比较简单,流量很大的网站,是直接将CSS写在html代码中的?他们有什么区别?CSS用import还是link好?从经典论坛和另外一个网站大概了解了一下. 看到淘宝网页中大部分是这样写的: 代码如下: <style type="text/css" media="screen"> @import url("http://www.taobao.com/home/c

宏定义的用法以及再次解释const和volatile

__I. __O .__IO是什么意思?这是ST库里面的宏定义,定义如下:#define     __I       volatile const        /*!< defines 'read only' permissions      */#define     __O     volatile                  /*!< defines 'write only' permissions     */#define     __IO    volatile      

const volatile int i

问题: const volatile int i=10:这行代码有没有问题?如果没有,那 i 到底是什么 属性? 回答: 没有问题,例如只读的状态寄存器.它是volatile,因为它可能被意想不到地改变:它是const,因为程序不应该试图去修改它. volatile和const并不矛盾,只是控制的范围不一样,一个在程序本身之外,另一个是程序本身. const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误.

特别没前途的C++ - explicit和volatile/const的内容

第一眼见到explicit和volatile可能会一愣一愣的觉得可能是c11或者c14新加的标识符. 其实不是这样,volatile和const两个关键字在C语言的第二个版本KR C的时候就被加入了C标准,他们是两个相对的关键字 const 修饰符表示这是一个常量类型,这个变量的值不会被程序改变 volatile 修饰符表示这个变量可能被编译器以外的行为(譬如内联汇编程序)改变. 修饰常量变量只要和类型紧挨着就可以 int const a = 1; const int a = 1; 修饰指针时以