3. volatile 关键字

volatile 关键字的作用是指示编译器 volatile 修饰的变量可能会被程序之外的设备所修改,不允许优化掉。

volatile 关键字在 嵌入式系统中常用。

volatile 的语法

volatile 数据类型 变量名;

说明

  1. 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 关键字。