被volatile修饰的变量,每次都去内存中取值,避免了编译器优化,不从寄存器中取。但是不能用一个非volatile的变量去引用volatile变量
错误代码
#include <stdio.h>
void func(void) {
static volatile int **ipp;
static int *ip;
static volatile int i = 0;
printf("i = %d.\n", i);
ipp = &ip; /* May produce a warning diagnostic */
ipp = (int**) &ip; /* Constraint violation; may produce a warning diagnostic */
*ipp = &i; /* Valid */
if (*ip != 0) { /* Valid */
/* ... */
}
}
正确代码
#include <stdio.h>
void func(void) {
static volatile int **ipp;
static volatile int *ip;
static volatile int i = 0;
printf("i = %d.\n", i);
ipp = &ip;
*ipp = &i;
if (*ip != 0) {
/* ... */
}
}
本文探讨了volatile关键字如何确保程序中对volatile变量的内存可见性,以及在代码中的正确使用方式。错误示例展示了volatile和非volatile变量交互可能导致的问题,而正确示例提供了最佳实践。

6079

被折叠的 条评论
为什么被折叠?



