본문 바로가기

연구 노트/C, C++

구조체 내부 변수 뒤 이것 ':'의 정체, '비트 필드'

변수명 뒤에 붙은 이것 ':', 뭐지?

구조체에 포함된 변수명 뒤에 콜론 기호(:)가 붙은 코드를 보게 되었습니다. 여태 본적이 없는 코드라 저것의 정체가 무엇인지 알아보았고, 그 내용을 간단히 정리하였습니다.

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?