C99中的易失性语义

我遇到了一些我正在编写的低级代码的问题,我需要将对象用作volatile,但不一定是因为我希望将类型声明为volatile(出于可重用性的原因)。 但是,我可以定义指向结构的限定变体的指针,如以下段中所述。

struct x { int bar; }; struct x foobar; ... volatile struct x *foo = &foobar; 

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

 volatile struct x { volatile int x; }; 

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

 struct x { struct y *bar; }; 

指向x的易变实例然后将其视为:

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

或作为:

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

我已经阅读了C标准,对此并不十分清楚,我可以通过多种方式轻松解释措辞。

在你的例子中,你得到一个易失性指针,就是这样,波动性不会扩展到对象。

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

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

 struct foo { int bar; }; struct foo *volatile x; 

请注意,我没有试过这个,所以我可能会非常不正确…这只是我从标准的粗略读物中收集到的。

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

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

鉴于:

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

在一个实例中,结构是易失性的。 在另一个,指针。