Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338750
  • 博文数量: 46
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 562
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-14 13:32
个人简介

先知者为师

文章分类

全部博文(46)

文章存档

2016年(1)

2015年(6)

2014年(20)

2013年(19)

我的朋友

分类: C/C++

2013-06-05 20:36:39

   《c primer plus 》书上的一段话:
  一个值可以同时是vonst和volatile。例如,硬件时钟一般设定为不能由程序改变,这一点使他成为const; 但它被程序以外的代理改变,这使它成为volatile的。只需在声明中同时使用这两个限定词,如下所示,顺序并不重要:  
volatile const int ioc; 
const volatile int *ploc;

[C语言深度剖析.-.解开程序员面试笔试的秘密].陈正冲.石虎  书中有这么一段话:

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

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

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

回答三:
volatile标识一个变量意味着这个变量可能被非本程序的其他过程改变,例如某个访问这一变量的某中断程序。为变量加上这一标识可以禁止编译器的优化,使程序正确地按设计者的意图运行。例如下面的程序,我们将intr_func注册为中断函数,某个中断发生时触发这一函数:

unsigned char flag = 1;

int main(int argc, char **argv)
 {

        reg_intr(XXX, intr_func);
        while(flag)
         {

            printf("hello\n");
        }
        return 0;
}

void intr_func(void) {
    flag = 0;
}

当不加volatile时,编译器会直接将while条件中的flag换成1,因此即使中断发生也无法结束循环;如果给flag加上volatile标识,编译器就不会做前述的优化,程序得以按设计的意图工作。
如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了。

阅读(2029) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~