Chinaunix首页 | 论坛 | 博客
  • 博客访问: 654508
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: C/C++

2010-08-16 17:21:16

 

const,volatile,

Const修饰的对象:变量,函数的参数和返回值,函数本身。

作用:

1)可以定义const常量         例如:
             const int i=100;

在另一连接文件中引用const常量
         extern const int i;     //
正确的引用

extern const int j=10;  //错误!常量不可以被再次赋值

2)便于进行类型检查            例如:
             void f(const int i) { .........}
        
编译器就会知道i是一个常量,不允许修改;
 
3)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
        
还是上面的例子,如果在函数体内修改了i,编译器就会报错;
        
例如: 
             void f(const int i) { i=10;//error! }

4)可以节省空间,避免不必要的内存分配。
         
例如:
              #define PI 3.14159         file://
常量宏
              const doulbe  Pi=3.14159;  file://
此时并未将Pi放入ROM
              ......
              double i=Pi;               file://
此时为Pi分配内存,以后不再分配!

5 提高了效率。
           
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

用法:

(1)       修饰变量 const int a = 1  int const a = 1 (两种一样)

(2)       修饰函数参数

如果函数的输入参数采用指针,用const修饰,防止意外修改指针指向内存单元,起保护作用。

       如果参数采用值传递,当函数内多次使用其初值,加const,可防止代码无意中修改。

如:void fun(const int value)

3)修饰函数的返回值:
        const
修饰符也可以修饰函数的返回值,是返回值不可被改变,格式如下:
            const int Fun1(); 

 

Volatile 的使用

将变量定义为volatile表示告诉编译器该变量可能会被意想不到的改变,则优化器每次用到该值都重新从内存读取它。例如:

       volatile int *temp;

       int a1,a2;

       temp = (unsigned int *)0x0040;

       a1 = *temp;

       a2 = *temp;

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

 

如果一个变量的值可能会被程序操作之外的其它操作所改变,那么你必需用volatile 声明。在嵌入式系统中其它操作是:中断服务程序的操作、硬件动作的操作。

volatile声明的变量是不会被编译器优化掉的,如:

volatile unsigned char PortA       @0x0000;

在嵌入式设备的所有外围器件寄存器都声明为volatile

 


 

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