2010-01-11 3 views
56

구조체 유형 변수의 인스턴스를 휘발성으로 선언하는 것으로 충분합니까 (재 입력 코드에서 필드에 액세스하는 경우) 또는 구조의 특정 필드를 휘발성으로 선언해야합니까? 휘발성 구조 의미

는 사이의 의미 차이 (있는 경우)이 무엇인지, 다르게 표현하면 : I 인식

typdef struct { 
    uint8_t bar; 
} foo_t; 

volatile foo_t foo_inst; 

typedef struct{ 
    volatile uint8_t bar; 
} foo_t; 

foo_t foo_inst; 

그 (휘발성 같은 포인터 유형 변수를 선언 등 휘발성 uint8_t * foo는)는 foo가 가리키는 주소가 변경 될 수 있다는 것을 컴파일러에 알리는 반면 foo가 가리키는 값에 대해서는 언급하지 않습니다. 구조 형 변수에 대한 비유가 있는지 여부는 분명하지 않습니다.

답변

61

예에서 두 개는 동일합니다. 그러나이 문제는 포인터를 중심으로 전개됩니다.

우선, volatile uint8_t *foo;은 컴파일러에게 지시되는 메모리가 volatile임을 알려줍니다. 포인터 자체를 휘발성으로 표시하려면 uint8_t * volatile foo;

그리고 구조체를 휘발성으로 표시하고 개별 필드를 표시하는 것과의 주요 차이점을 얻을 수 있습니다. 당신이 있다면 : 좋아

typedef struct 
{ 
    uint8_t * volatile field; 
} foo; 

하지 :

typedef struct 
{ 
    uint8_t *field; 
} foo; 

volatile foo f; 

처럼 행동 할 그

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

필드가'uint8_t field [10]'인 경우 구조체를 휘발성으로 표시하면 내부 데이터가 휘발성으로 표시되거나 "effec tive "로 표시된 필드에 대한 포인터? –

+1

기본 데이터는 휘발성입니다. 생각할 한가지는 '효과적인'포인터는 수정할 수 없다는 것입니다 (항상 첫 번째 요소의 주소 임). 휘발성은 의미가 없습니다. 사이드 바의 –

13

당신이 모든 회원은 휘발성이 될 것입니다 휘발성이있는 구조를 선언하는 경우

+0

이것은 const에서도 마찬가지입니다. – Alon