90

Is it sufficient to declare an instance of a structure-typed variable as volatile (if its fields are accessed in re-entrant code), or must one declare specific fields of the structure as volatile?

Phrased differently, what are the semantic differences (if any) between:

typdef struct {
  uint8_t bar;
} foo_t;

volatile foo_t foo_inst;

and

typedef struct{
  volatile uint8_t bar;
} foo_t;

foo_t foo_inst;

I recognize that declaring a pointer-typed variable as volatile (e.g. volatile uint8_t * foo) merely informs the compiler that the address pointed-to by foo may change, while making no statement about the values pointed to by foo. It is unclear to me whether an analogy holds for structure-typed variables.

1
  • In C there is no difference between both versions, however, in C++ they are different, as this example shows: godbolt.org/z/fYhzMKqjj You can try for yourself. Commented Dec 8, 2021 at 11:08

2 Answers 2

97

In your example, the two are the same. But the issues revolve around pointers.

First off, volatile uint8_t *foo; tells the compiler the memory being pointed to is volatile. If you want to mark the pointer itself as volatile, you would need to do uint8_t * volatile foo;

And that is where you get to the main differences between marking the struct as volatile vs marking individual fields. If you had:

typedef struct
{
    uint8_t *field;
} foo;

volatile foo f;

That would act like:

typedef struct
{
    uint8_t * volatile field;
} foo;

and not like:

typedef struct
{
    volatile uint8_t *field;
} foo;
Sign up to request clarification or add additional context in comments.

4 Comments

If the field were a uint8_t field[10], when you mark the structure as volatile is the underlying data marked as volatile or the "effective" pointer to field marked volatile?
The underlying data is volatile. One thing to think about is that the 'effective' pointer is not modifiable (it's always the address of the first element) so volatile would have no meaning in regards to it.
Can a structure definition be marked as volatile? Or must that remain with the typedef or instance variables only?
@sherrellbc For the record, volatile is applied either to members in the struct definition, or to declared variables of the struct type, but not to the struct definition itself (or a typedef). At least some compilers will report an error if you try.
34

if you declare a structure with volatile then all its members will also be volatile

1 Comment

on a sidebar this is also true for const

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.