2010-01-11 18 views
56

Yapı tipinde bir değişkenin örneğini uçucu olarak (alanlarına yeniden giriş kodunda erişilirse) bildirmek veya yapının belirli alanlarını uçucu olarak bildirmesi yeterli midir? Uçucu Yapı Anlamları

arasındaki anlamsal farklar (varsa) ne, farklı ifade: Ben tanımak

typdef struct { 
    uint8_t bar; 
} foo_t; 

volatile foo_t foo_inst; 

ve

typedef struct{ 
    volatile uint8_t bar; 
} foo_t; 

foo_t foo_inst; 

ki (uçucu olarak bir işaretçi türde bir değişken bildirerek örneğin uçucu uint8_t * foo) derleyiciyi foo tarafından işaret edilen adresin değiştirebileceğini sadece bilgi verirken, foo tarafından işaret edilen değerler hakkında hiçbir açıklama yapmaz. Yapı tipi yazılan değişkenler için bir analojinin tutulup tutulmadığı belirsizdir.

cevap

61

Örneğinizde, ikisi aynıdır. Ancak konular işaretçiler etrafında dönüyor.

İlk kapalı, volatile uint8_t *foo; derleyiciye işaret edilen belleğin uçucu olduğunu bildirir. İşaretçiyi uçucu olarak işaretlemek isterseniz, uint8_t * volatile foo;

'u yapmanız gerekir. Yapı, uçucu alanları işaretleme ve tek tek alanları işaretleme arasındaki temel farklara vardığınız yerdir. Eğer olsaydı: mi

typedef struct 
{ 
    uint8_t * volatile field; 
} foo; 

değil:

typedef struct 
{ 
    uint8_t *field; 
} foo; 

volatile foo f; 

gibi davranırdım O

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

Eğer alan bir uint8_t alanıymışsa [10] ', yapıyı uçucu olarak işaretlediğinizde, altta yatan veriler uçucu veya" effec "olarak işaretlenir. tive "işaretçisi uçucu işaretli alana mı? –

+1

Temel veriler uçucudur. Düşünülecek bir şey, 'etkili' göstericinin değiştirilememesidir (her zaman ilk elementin adresidir), bu yüzden uçuculuğun hiçbir anlamı yoktur. Bir kenar çubuğunda –

13

sonra tüm üyeleri de uçucu olacak uçucu bir yapıya ilan etmeleri halinde

+0

bu da const için doğrudur – Alon

İlgili konular