2009-06-11 39 views
12

Tôi có một vấn đề với một số mã mức thấp Tôi viết thư này, tôi cần phải sử dụng đối tượng như biến động, nhưng nó không nhất thiết phải vì vậy mà tôi muốn các loại được khai báo là không ổn định (vì lý do tái sử dụng). Tuy nhiên, tôi có thể xác định con trỏ đến một biến thể đủ điều kiện của một cấu trúc như được nêu chi tiết trong phân đoạn sau.ngữ nghĩa dễ bay hơi trong C99

struct x { 
    int bar; 
}; 

struct x foobar; 
... 
volatile struct x *foo = &foobar; 

Bây giờ foo là một cách hiệu quả một con trỏ đến một đối tượng của loại:

volatile struct x { 
    volatile int x; 
}; 

kể từ biến động áp dụng đối với tất cả các thành viên struct. Bây giờ câu hỏi của tôi là khi một đối tượng chứa một con trỏ tới một đối tượng khác, thì sự biến động được áp dụng như thế nào?

struct x { 
    struct y *bar; 
}; 

sẽ một con trỏ đến một trường hợp biến động của x sau đó thì điều này như là:

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

hay như:

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

Tôi đã đọc qua tiêu chuẩn C, và nó không rõ ràng về điều này, và tôi có thể dễ dàng diễn giải từ ngữ theo nhiều cách.

Trả lời

4

Trong ví dụ của bạn, bạn có được con trỏ dễ bay hơi, đó là tất cả, sự biến động không được mở rộng đối tượng.

Mở rộng về câu trả lời của tôi không ổn định là một thư giãn nguyên tử, có nghĩa là truy cập là nguyên tử, nhưng hướng dẫn sẽ không được. Vì vậy, bạn không thể increafely increment hoặc decrement một dễ bay hơi, vì vậy bạn không thể sử dụng một con trỏ dễ bay hơi cho interation, chỉ lưu trữ/tải (assigment) hoạt động. Cùng đi với một số int hoặc số khác, và dễ bay hơi cũng sẽ không hoạt động với phao vì chúng được xử lý trong đường ống FPU, không phải CPU. Tất cả trong tất cả các biến động không phải là quá hữu ích, nhưng trình biên dịch của Microsoft tự động đặt hướng dẫn bảo vệ xung quanh bay hơi, làm cho chúng giá trị nguyên tử thực sự, nhưng đó không phải là một phần của tiêu chuẩn.

+0

http://www.netrino.com/node/80 Dường như hỗ trợ ý tưởng đó. Tôi chưa bao giờ đọc trên volitile. Đồ tốt. – Kieveli

+1

"dễ bay hơi không quá hữu ích": không biết về phần mềm PC, nhưng trong các hệ thống nhúng, chúng cần thiết để khai báo các thanh ghi phần cứng hoặc các biến có thể thay đổi trong các ngắt. –

+0

Điểm rất tốt! Đã một vài năm kể từ dự án nhúng cuối cùng của tôi, nên tôi đã quên mất điều đó. Dù sao mà làm việc vì nó là cho tải và cửa hàng. Trên PC, thật dễ dàng để quên đi hầu hết các ngắt khi chúng bị lỗi hệ điều hành api. –

2

Đọc qua tiêu chuẩn here, có vẻ như con trỏ dễ bay hơi, nhưng không phải là nội dung thực tế của cấu trúc. Tôi giải thích rằng từ ví dụ được đưa ra, const t * volatile p (ở cuối liên kết). Các từ ngữ, tuy nhiên, là mơ hồ, nhưng tôi nghĩ rằng đây sẽ là một ví dụ tương tự:

struct foo { 
    int bar; 
}; 

struct foo *volatile x; 

Lưu ý rằng tôi đã không cố gắng này, vì vậy tôi có thể cực kỳ không chính xác ... nó chỉ đơn giản là những gì tôi đã thu thập từ một bài đọc qua các tiêu chuẩn.

Hơn nữa, cdecl làm sáng tỏ một số sự mơ hồ.Ví dụ:

cdecl> giải thích volatile struct x* foo
khai báo foo như con trỏ đến struct dễ bay hơi x

Trong đó:

cdecl> giải thích struct x* volatile foo
khai báo foo là dễ bay hơi con trỏ đến cấu trúc x

Trong một trường hợp, cấu trúc dễ bay hơi. Mặt khác, con trỏ.

+1

vì vậy bạn không thể chỉ cần cấu trúc dễ bay hơi x * foo biến động; cho một con trỏ dễ bay hơi và struct? – Earlz

+0

@earlz: Có. Chính xác. volatile struct x * volatile foo là một con trỏ dễ bay hơi đến một cấu trúc biến động x. – FreeMemory

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