如何将结构的特定成员声明为volatile?
答案 0 :(得分:32)
与非struct
字段完全相同:
#include <stdio.h>
int main (int c, char *v[]) {
struct _a {
int a1;
volatile int a2;
int a3;
} a;
a.a1 = 1;
a.a2 = 2;
a.a3 = 3;
return 0;
}
您可以使用struct
将整个"volatile struct _a {...}"
标记为易变,但上述方法适用于各个字段。
答案 1 :(得分:10)
根据this文章应该非常直接:
最后,如果你将volatile应用于 struct或union,整个内容 struct / union的变化是不稳定的。如果 你不希望这种行为 将volatile限定符应用于 个人成员 结构/联合
答案 2 :(得分:2)
我需要澄清C / C ++的volatile,因为这里有一个错误的答案。自1994年以来,我一直在编写微控制器,这个关键字非常有用并经常需要。
volatile永远不会破坏你的代码,使用它永远不会有风险。关键字基本上确保编译器不优化变量。如果你过度使用这个关键字,最糟糕的情况就是你的程序会变得更大更慢。
以下是您需要变量的关键字时: - 你有一个写入中断函数内的变量。 和 - 读取或写入外部中断函数的相同变量。 要么 如果您有2个使用该变量的不同优先级的中断函数,那么您还应该使用&#39; volatile&#39;。
否则,不需要关键字。
对于硬件寄存器,如果你不在你的程序中做奇怪的事情,即使没有关键字也应该将它们视为易失性。
答案 3 :(得分:0)
我刚刚完成了一个数据结构,其中很明显需要使用volatile限定符,但是出于与上述原因不同的原因:仅仅是因为该结构由于(i )直接访问和(ii)等效调用。
直接访问 通过持续的RAM读写实现。
等效调用 使用可互换的方法流进行交易。
除非编译器确切知道该怎么做,否则我对这个关键字不太满意。那是我自己的个人经历。但是我感兴趣的是研究它如何直接影响跨平台编译,例如在低级系统调用和后端数据库之间。