developer tip

C 구조체의 ":"(콜론)-무슨 뜻입니까?

copycodes 2020. 10. 8. 08:10
반응형

C 구조체의 ":"(콜론)-무슨 뜻입니까?


이 질문에 이미 답변이 있습니다.

struct _USBCHECK_FLAGS
    {
        unsigned char   DEVICE_DEFAULT_STATE       : 1;
        unsigned char   DEVICE_ADDRESS_STATE       : 1;
        unsigned char   DEVICE_CONFIGURATION_STATE : 1;
        unsigned char   DEVICE_INTERFACE_STATE     : 1;
        unsigned char   FOUR_RESERVED_BITS         : 8;
        unsigned char   RESET_BITS                 : 8;
    } State_bits;

무엇 :1:8의미합니까?


그것들은 비트 필드입니다. 기본적으로 콜론 뒤의 숫자는 필드가 사용하는 비트 수를 나타냅니다. 다음은 비트 필드를 설명하는 MSDN인용문입니다 .

상수 표현식은 필드의 너비를 비트 단위로 지정합니다. 선언자의 유형 지정자는 unsigned int, signed int 또는 int 여야하며 constant-expression은 음이 아닌 정수 값이어야합니다. 값이 0이면 선언에 선언자가 없습니다. 비트 필드의 배열, 비트 필드에 대한 포인터 및 비트 필드를 반환하는 함수는 허용되지 않습니다. 선택적 선언자는 비트 필드의 이름을 지정합니다. 비트 필드는 구조의 일부로 만 선언 할 수 있습니다. 연산자 주소 (&)는 비트 필드 구성 요소에 적용 할 수 없습니다.

명명되지 않은 비트 필드는 참조 할 수 없으며 런타임시 해당 내용을 예측할 수 없습니다. 정렬을 위해 "더미"필드로 사용할 수 있습니다. 너비가 0으로 지정된 명명되지 않은 비트 필드는 struct-declaration-list에서 그 뒤에 오는 멤버에 대한 스토리지가 int 경계에서 시작됨을 보장합니다.

이 예제는 screen이라는 구조의 2 차원 배열을 정의합니다.

struct 
{
    unsigned short icon : 8;
    unsigned short color : 4;
    unsigned short underline : 1;
    unsigned short blink : 1;
} screen[25][80];

편집 : MSDN 링크의 또 다른 중요한 부분 :

비트 필드는 정수 유형과 동일한 의미를 갖습니다. 즉, 비트 필드에있는 비트 수에 관계없이 동일한 기본 유형의 변수가 사용되는 것과 똑같은 방식으로 식에서 비트 필드가 사용됩니다.

간단한 샘플이이를 잘 보여줍니다. 흥미롭게도 혼합 유형을 사용하면 컴파일러가 기본적으로 sizeof (int).

  struct
  {
    int a : 4;
    int b : 13;
    int c : 1;
  } test1;

  struct
  {
    short a : 4;
    short b : 3;
  } test2;

  struct
  {
    char a : 4;
    char b : 3;
  } test3;

  struct
  {
    char a : 4;
    short b : 3;
  } test4;

  printf("test1: %d\ntest2: %d\ntest3: %d\ntest4: %d\n", sizeof(test1), sizeof(test2), sizeof(test3), sizeof(test4));

test1 : 4

test2 : 2

test3 : 1

test4 : 4


I also ran into the colon notation but in my context bit fields didn't make sense. So I did some digging. This notation is also used for assigning values - in my specific situation pointers to functions.

Source: http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm

Below is a sample and an excerpt to explain.

"There is a gcc extension that makes assigning to this structure more convenient. You'll see it in modern drivers, and may catch you by surprise. This is what the new way of assigning to the structure looks like:"

struct file_operations fops = {
   read: device_read,
   write: device_write,
   open: device_open,
   release: device_release
};

The C99 (old, compatible) way looks like:

struct file_operations fops = {
   .read = device_read,
   .write = device_write,
   .open = device_open,
   .release = device_release
};

It defines bit-fields of width 1 and 8.

참고URL : https://stackoverflow.com/questions/8564532/colon-in-c-struct-what-does-it-mean

반응형