2010-01-11 47 views
56

Có đủ để khai báo một thể hiện của biến cấu trúc như biến động (nếu trường của nó được truy nhập trong mã lại), hoặc phải khai báo các trường cụ thể của cấu trúc là dễ bay hơi?Ngữ nghĩa cấu trúc dễ bay hơi

phrased cách khác nhau, sự khác biệt về ngữ nghĩa (nếu có) giữa là gì:

typdef struct { 
    uint8_t bar; 
} foo_t; 

volatile foo_t foo_inst; 

typedef struct{ 
    volatile uint8_t bar; 
} foo_t; 

foo_t foo_inst; 

tôi nhận ra rằng khai báo một biến con trỏ gõ như dễ bay hơi (ví dụ dễ bay hơi uint8_t * foo) chỉ thông báo cho trình biên dịch rằng địa chỉ được trỏ tới bởi foo có thể thay đổi, trong khi không đưa ra tuyên bố nào về các giá trị được trỏ tới bởi foo. Nó không rõ ràng với tôi cho dù một tương tự giữ cho các biến cấu trúc gõ.

Trả lời

61

Trong ví dụ của bạn, cả hai đều giống nhau. Nhưng các vấn đề xoay quanh con trỏ.

Trước hết, volatile uint8_t *foo; cho trình biên dịch biết rằng bộ nhớ được trỏ đến là dễ bay hơi. Nếu bạn muốn đánh dấu con trỏ chính nó là dễ bay hơi, bạn sẽ cần phải làm uint8_t * volatile foo;

Và đó là nơi bạn nhận được sự khác biệt chính giữa việc đánh dấu cấu trúc là dễ bay hơi so với đánh dấu các trường riêng lẻ. Nếu bạn đã có:

typedef struct 
{ 
    uint8_t *field; 
} foo; 

volatile foo f; 

Điều đó sẽ hành động như:

typedef struct 
{ 
    uint8_t * volatile field; 
} foo; 

và không thích:

typedef struct 
{ 
    volatile uint8_t *field; 
} foo; 
+1

Nếu trường là trường 'uint8_t [10]', khi bạn đánh dấu cấu trúc là dễ bay hơi là dữ liệu cơ bản được đánh dấu là dễ bay hơi hoặc "effec tive "con trỏ đến trường được đánh dấu dễ bay hơi? –

+1

Dữ liệu cơ bản là dễ bay hơi. Một điều cần suy nghĩ là con trỏ 'hiệu quả' không thể sửa đổi được (nó luôn là địa chỉ của phần tử đầu tiên) nên dễ bay hơi sẽ không có ý nghĩa gì liên quan đến nó. –

13

nếu bạn khai báo một cấu trúc với không ổn định thì tất cả các thành viên của nó cũng sẽ biến động

+0

trên thanh bên, điều này cũng đúng đối với const – Alon

Các vấn đề liên quan