分类: 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