代码之家  ›  专栏  ›  技术社区  ›  vicatcu

可变结构语义

  •  61
  • vicatcu  · 技术社区  · 15 年前

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

    措辞不同,以下两种语言之间的语义差异(如果有的话)是什么:

    typdef struct {
      uint8_t bar;
    } foo_t;
    
    volatile foo_t foo_inst;
    

    typedef struct{
      volatile uint8_t bar;
    } foo_t;
    
    foo_t foo_inst;
    

    我认识到,将指针类型变量声明为volatile(例如volatile uint8_t*foo)只会通知编译器foo指向的地址可能会更改,而不对foo指向的值进行任何声明。对于结构类型变量,我不清楚这种类比是否成立。

    2 回复  |  直到 9 年前
        1
  •  70
  •   R Samuel Klatchko    9 年前

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

    首先, volatile uint8_t *foo; 告诉编译器指向的内存是不稳定的。如果要将指针本身标记为易失性,则需要执行以下操作 uint8_t * volatile foo;

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

    typedef struct
    {
        uint8_t *field;
    } foo;
    
    volatile foo f;
    

    表现为:

    typedef struct
    {
        uint8_t * volatile field;
    } foo;
    

    而不是像:

    typedef struct
    {
        volatile uint8_t *field;
    } foo;
    
        2
  •  17
  •   Alon    15 年前

    如果您声明一个具有volatile的结构,那么它的所有成员也将是volatile的