22

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

4

4 回答 4

35

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 {...}"但上述方法适用于单个字段。

于 2009-06-11T06:59:58.267 回答
11

根据这篇文章应该很简单:

最后,如果将 volatile 应用于结构或联合,则结构/联合的全部内容都是易失的。如果您不希望这种行为,您可以将 volatile 限定符应用于结构/联合的各个成员。

于 2009-06-11T06:59:32.607 回答
8

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

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

这是您需要为变量使用此关键字的时候: - 您有一个写入中断函数内部的变量。AND - 将同一变量读取或写入外部中断函数。或如果您有 2 个使用该变量的不同优先级的中断函数,那么您也应该使用“volatile”。

否则,不需要关键字。

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

于 2018-05-15T15:35:47.147 回答
-1

我刚刚完成了一个数据结构,其中很明显需要 volatile 限定符,但原因与上述不同:这仅仅是因为(i)直接访问(ii )结构需要强制锁定机制) 等效调用


直接访问 处理持续的 RAM 读取和写入。

等效调用 处理可互换的方法流。


除非编译器确切地知道如何处理它,否则我对这个关键字的运气并不好。这是我自己的亲身经历。但我有兴趣研究它如何直接影响跨平台编译,例如低级系统调用和后端数据库之间的编译。

于 2019-08-27T16:42:17.730 回答