在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 ..它值得检查那些转储。