리눅스 커널 소스를 살펴보다가 스트럭쳐 안에 이상한 형식의 변수 선언을 보았다.
struct task_struct {
...
unsigned did_exec:1;
...
};
이런 형태였는데, 변수를 선언한 다음 콜론(:)과 숫자가 오는 형태는 여지껏 본 적이 없었다.
구글링을 하여 찾아보니 bit field라는 이름의 C언어의 문법 중 하나라는 것을 알게 되었고
위키피디아에서 좀 더 자세한 글을 찾게 되어 번역해 보았다.
미리 이야기하자면 위의 구문은 did_exec라는 1bit짜리 변수를 선언한 것이다.
=======================================================================================
출처: http://en.wikipedia.org/wiki/C_syntax (Bit fields의 번역)
C언어는 bit field라고 알려진 특별한 형식의 스트럭쳐 멤버를 제공한다.
bit filed는 bit의 수를 명시한 integer 변수이다. bit filed는 signed int, unsigned int 혹은
_Bool의 스트럭쳐 멤버 형식과 멤버의 이름을 명시한 후 콜론을 쓰고 멤버 변수가 갖게 될 bit의 수를 적는다.
bit field의 총 bit 수는 명시된 형식의 최대 bit 수를 넘을 수 없다.
C언어 문법의 특별 예외 사항으로, sined 나 unsigned를 명시하지 않으면 정의된
int의 타입이 singed인지 unsigned인지 알 수 없다. 따라서 이식성(potability)을 위해 모든 스트럭쳐 멤버는
singed, unsigned를 명시하는 것을 권장한다.
콜론과 비트의 수로 이루어진 빈 bit field 엔트리도 허용하는데 이것은 padding을 의미한다.
bit field의 멤버는 주소를 갖지 않기 때문에 & 주소 연산자를 사용할 수 없다.
또한 bit field는 sizeof 연산자도 사용할 수 없다.
아래의 선언문은 f 타입으로 명명되고 g라는 인스턴스를 갖는 새로운 스트럭쳐를 정의한다.
각 멤버의 선언에 대해 간략히 주석을 달아놓았다.
struct f
{
unsigned int flag : 1; -- bit flag: on(1) 또는 off(0)의 값을 가질 수 있다. --
signed int num : 4; -- signed 4-bit field; -7...7 또는 -8...7의 값을 갖는다. (???) --
: 3; -- 스트럭쳐를 8bit로 맞추기 위한 3bit의 padding bit --
} g;