易变结构语义


74

将结构类型变量的实例声明为volatile是否足够(如果其字段以可重入代码访问),还是必须将结构的特定字段声明为volatile?

措辞不同,以下两者之间的语义差异(如果有):

我认识到,将指针类型的变量声明为volatile(例如volatile uint8_t * foo)仅通知编译器foo指向的地址可能会更改,而没有声明foo指向的值。对我来说还不清楚结构类型变量是否适用类推。

Answers:


79

在您的示例中,两者是相同的。但是问题围绕着指针。

首先,volatile uint8_t *foo;告诉编译器所指向的内存是易失的。如果要将指针本身标记为易失性,则需要uint8_t * volatile foo;

这就是将结构标记为易失性与标记各个字段之间的主要区别。如果你有:

那就像:

而不像:


1
如果该字段为uint8_t field[10],则在将结构标记为volatile时,是将基础数据标记为volatile还是指向该字段的“有效”指针标记为volatile?
Mark Elliot 2010年

1
基础数据是易失的。要考虑的一件事是,“有效”指针不可修改(它始终是第一个元素的地址),因此volatile对此没有任何意义。
R Samuel Klatchko 2010年

可以将结构definition标记为易失性吗?还是必须仅保留typedef或实例变量?
sherrellbc

25

如果用volatile声明结构,则其所有成员也将是volatile


6
在侧边栏这也适用于常量
阿龙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.