변수명 뒤에 붙은 이것 ':', 뭐지?
구조체에 포함된 변수명 뒤에 콜론 기호(:)가 붙은 코드를 보게 되었습니다. 여태 본적이 없는 코드라 저것의 정체가 무엇인지 알아보았고, 그 내용을 간단히 정리하였습니다.
typedef union UARTDR_t
{
uint32_t all;
struct {
uint32_t DATA:8; // 7:0
uint32_t FE:1; // 8
uint32_t PE:1; // 9
uint32_t BE:1; // 10
uint32_t OE:1; // 11
uint32_t reserved:20;
} bits;
} UARTDR_t;
정답은 비트 필드!
구조체 멤버 변수 뒤에 사용되는 콜론 기호(:)는 비트 필드를 구현할 때 사용하는 것입니다. 레지스터값에 직접 접근하는 저수준(low level)의 코드에서 자주 사용된다고 하네요. 사용법은 어렵지 않습니다. 콜론 기호 뒤에 적힌 숫자만큼의 비트를 저장할 수 있는 것이지요.
구조체의 크기는 선언된 변수 중 가장 큰 크기의 타입을 기본 단위로 합니다. 그리고 선언된 비트 필드를 모두 포함할 수 있는 크기로 설정되지요. 위 코드를 예를 들자면 bits
구조체의 크기는 4바이트(32비트)가 됩니다. 그런데 만약 비트 공간을 1비트 추가하게 되면 저 구조체의 크기는 8바이트(64비트)가 됩니다. 사용하는 비트 필드 범위가 줄어들 때도 같은 방식으로 구조체 크기가 결정됩니다. 구조체 안의 unsigned int
형 변수에다가 단 1비트만 사용한다고 선언하더라도 그 구조체의 크기는 4바이트(32비트)가 됩니다. 이런 경우 변수 형을 unsigned char
로 수정한다면 구조체 크기를 1바이트(8비트)로 줄이는 방법을 쓸 수 있겠습니다.
참고 자료
C언어 코딩도장, 56 구조체 비트 필드 사용하기
stack overflow, “:” (colon) in C struct - what does it mean?
'연구 노트 > C, C++' 카테고리의 다른 글
C++를 사용할 수 있는 GUI 라이브러리 모음 (0) | 2022.08.24 |
---|---|
[다시 C언어] 함수 반환형, 안적어도 될까? (0) | 2021.02.18 |
[다시 C언어] 시작하며. (0) | 2021.02.18 |
C언어에서 가변 인자 함수를 만들려면? (0) | 2021.02.07 |
헤더 파일 중복 방지 왜 필요할까? (0) | 2019.08.31 |