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

时间:2009-06-11 06:52:47

标签: c struct volatile

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

4 个答案:

答案 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读写实现。

等效调用 使用可互换的方法流进行交易。


除非编译器确切知道该怎么做,否则我对这个关键字不太满意。那是我自己的个人经历。但是我感兴趣的是研究它如何直接影响跨平台编译,例如在低级系统调用和后端数据库之间。