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

23

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


关于 C/C++ volatile 关键字需要提一个警告。除非你知道自己在做什么,否则不应该使用它。C/C++ 的 volatile 与 java/C# 的 volatile 不同,在多线程代码中使用 volatile 并不会帮助你,除非你确实知道自己在做什么,你需要使用 C++0x atomic 模板(或类似的东西)。我唯一需要使用 volatile 的时候是在控制硬件寄存器时。 - Shane Powell
3
同样的话可以用在while循环,或者任何东西上。除非你知道你在做什么,否则很少有东西能够帮助你写出多线程/任何代码。关键是要学会如何使用它。 - paxdiablo
4个回答

36

与非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;
}
您可以通过使用"volatile struct _a {...}" 将整个 struct 标记为易变,但上面的方法是针对单个字段的。

11

根据这篇文章,应该很容易理解:

最后,如果您将 volatile 应用于结构体或联合体,则整个结构体/联合体的内容都是 volatile 的。如果您不希望出现这种情况,则可以将 volatile 限定符应用于结构体/联合体的各个成员。


该页面现在不可用。 - Vishnu CS

9
我需要澄清C/C++中的volatile,因为这里有一个错误的答案。自从1994年以来,我一直在编写微控制器代码,其中这个关键字非常有用且经常需要使用。
使用volatile永远不会破坏你的代码,使用它也不会有风险。该关键字基本上会确保变量不会被编译器优化。如果过度使用此关键字,最糟糕的情况就是程序会变得更大、更慢。
以下情况下需要使用该关键字: - 在中断函数内部写入变量。 并且 - 在中断函数外部读取或写入同一变量。 或者 如果有两个具有不同优先级的中断函数使用该变量,则还应使用'volatile'。
否则,不需要使用该关键字。
至于硬件寄存器,即使在程序中不进行奇怪的操作,也应将其视为易失性的。

-2
我刚刚完成了一个数据结构,其中明显需要使用volatile限定符,但原因与上述不同:这仅仅是因为该结构需要一种强制锁定机制,因为它涉及到直接访问和等效调用。

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

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


除非编译器确切知道如何处理它,否则我在使用这个关键字方面并没有太好的运气。这是我的个人经验。但我对研究它如何直接影响跨平台编译(例如低级系统调用和后端数据库之间)很感兴趣。


以后参考一下为什么人们可能会投票反对这个回答:这个回答并没有回答被问出来的问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接