3. volatile 关键字
volatile 关键字的作用是指示编译器 volatile 修饰的变量可能会被程序之外的设备所修改,不允许优化掉。
volatile 关键字在 嵌入式系统中常用。
volatile 的语法
volatile 数据类型 变量名;
说明
- volatile 关键字和 const 关键字都是类型修饰符,其用法和 const 也基本一致。
示例
我们来分析如下程序的运行结果。
#include <stdio.h>
int main(int argc, char * argv[]) {
const int x = 100;
int y = x;
int z = y;
printf("z:%d\n", z);
return 0;
}
在编译器优化后可能如下:
#include <stdio.h>
int main(int argc, char * argv[]) {
// ... 此处的代码都被优化掉了
printf("z:%d\n", 100);
return 0;
}
如果不希望将变量 y 进行优化,可以写成
#include <stdio.h>
int main(int argc, char * argv[]) {
const int x = 100;
volatile int y = x; // 禁止编译器优化y这个变量。
int z = y;
printf("z:%d\n", z);
return 0;
}
这样至少变量 y 不会被优化,至于变量 x 和 z 是否被优化,这个将由编译器和优化级别来决定。
使用 volatile 时,如下的用法是合理的。
// 以下两种写法效果相同
volatile int x;
int volatile x;
// 指针不可优化,指针指向的内容也不可优化
volatile int * volatile px;
实验
尝试使用 volatile 修饰变量,看你的编译器是否支持 volatile 关键字。