12

我正在编写的一些低级代码存在问题,我需要将对象用作易失性对象,但这并不一定是我希望将类型声明为易失性(出于可重用性原因)。但是,我可以定义指向结构的合格变体的指针,如以下部分所述。

struct x {
  int bar;
};

struct x foobar;
...
volatile struct x *foo = &foobar;

现在 foo 实际上是一个指向该类型对象的指针:

volatile struct x {
  volatile int x;
};

因为 volatile 适用于所有结构成员。现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用易失性?

struct x {
  struct y *bar;
};

将指向 x 的 volatile 实例的指针然后将其视为:

volatile struct x {
  struct y * volatile bar;
};

或作为:

volatile struct x {
  volatile struct y * volatile bar;
};

我通读了 C 标准,对此不是很清楚,我可以很容易地以多种方式解释措辞。

4

2 回答 2

4

在您的示例中,您得到一个 volatile 指针,仅此而已,波动性并未扩展到对象。

扩展我的答案 volatile 是一个轻松的原子,这意味着访问是原子的,但指令不会。因此,您不能线程安全地递增或递减 volatile,因此您不能使用 volatile 指针进行交互,只能使用存储/加载(分配)操作。对于 int 或其他数字也是如此,并且 volatile 也不适用于浮点数,因为它们是在 FPU 管道中处理的,而不是在 CPU 中处理的。总而言之 volatile 并不太有用,但微软的编译器会自动在 volatile 周围放置指令保护,使它们成为真正的原子值,但这不是标准的一部分。

于 2009-06-11T14:26:06.277 回答
2

阅读此处的标准,似乎指针是易失的,但不是结构本身的实际内容。我从给出的示例中解释了这一点const t * volatile p(在链接的底部)。然而,措辞含糊不清,但我认为这将是一个类似的例子:

struct foo {
    int bar;
};

struct foo *volatile x;

请注意,我没有尝试过这个,所以我可能非常不正确......这只是我从粗略阅读标准中收集的内容。

此外,cdecl 确实消除了一些模糊性。例如:

cdecl> 解释volatile struct x* foo
将 foo 声明为指向 volatile struct x 的指针

然而:

cdecl> 解释struct x* volatile foo
将 foo 声明为 struct x 的 volatile 指针

在一种情况下,该结构是易失的。另一方面,指针。

于 2009-06-11T14:28:09.423 回答