在C中,如何将结构的成员声明为volatile?

如何将结构的特定成员声明为volatile?

与非struct字段完全相同:

 #include  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; } 

您可以使用"volatile struct _a {...}"将整个struct标记为volatile,但上面的方法适用于各个字段。

根据这篇文章应该很直接:

最后,如果将volatile应用于struct或union,则struct / union的整个内容都是volatile。 如果您不想要此行为,可以将volatile限定符应用于struct / union的各个成员。

只是对C / C ++ volatile关键字的警告。

除非你知道自己在做什么,否则永远不要使用它。

C / C ++ volatile!= java / C#volatile

volatile在线程代码中没有帮助,除非你真的知道你在做什么,你需要使用C ++ 0xprimefaces模板(或类似的东西)。

我唯一需要使用volatile的是控制硬件寄存器。

我需要澄清C / C ++的volatile,因为这里有一个错误的答案。 自1994年以来,我一直在编写微控制器,这个关键字非常有用且经常需要。

volatile永远不会破坏你的代码,使用它永远不会有风险。 关键字基本上可以确保编译器不优化变量。 如果过度使用此关键字,最糟糕的情况是您的程序会更大更慢。

这是你需要一个变量的关键字: – 你有一个写入中断函数内的变量。 AND – 将相同的变量读取或写入外部中断函数。 或者如果您有2个使用该变量的不同优先级的中断函数,那么您还应该使用’volatile’。

否则,不需要关键字。

至于硬件寄存器,如果你不在你的程序中做奇怪的事情,即使没有关键字也应该将它们视为易失性。

如果声明为volatile的成员由于服务某些中断而没有改变(即信号处理程序或其他(近)primefaces变量),你可能不应该使用volatile(因为如果它不够接近,大多数编译器会优化它)。

否则,正如其他人所说..只是使用它然后检查asm转储,看看你的编译器是否真的同意你:)

在某些情况下,即某些版本的gcc ..它值得检查那些转储。