位域声明的不寻常语法

时间:2015-01-20 09:40:45

标签: c gcc

我遇到了一个我以前从未见过的bitfield语法。

       struct msg_hdr0{
                        uint8_t a  : 1,
                        b         : 1,
                        e         : 4,
                        f         : 2;                                                                                                                                                                       
               };

     int main(void)
     {
     struct msg_hdr0 hdr;

     bzero((void *)&hdr, sizeof(hdr));
     hdr.b = 1;

     printf("hdr = 0x%X\n", *(uint32_t *)&hdr);

     return 0;
     }

这适用于linux& gcc编译器。 谁能建议我在哪里可以找到关于此的任何文档。 这是GCC扩展吗?

常见的位域语法是:

    struct box_props
   {
 unsigned int opaque       : 1;
 unsigned int fill_color   : 3;
 unsigned int              : 4; // fill to 8 bits
 unsigned int show_border  : 1;
 unsigned int border_color : 3;
 unsigned int border_style : 2;
 unsigned int              : 2; // fill to 16 bits
};

3 个答案:

答案 0 :(得分:1)

在函数中,您可以在单个语句或多个语句中声明变量列表。

void myFunction(void)
{
    // Declare several variables (of teh same type) in a single statement
    int a, b, c;
    // Declare some more, each in their own statement
    int x;
    int y;
    int z;
}

类似地,结构中的位字段。

struct myStruct
{
    // Declare several bitfields in a single statement
    int a : 1, b : 3, c : 4;
    // Declare some more, each in their own statement
    int x : 1;
    int y : 3;
    int z : 4;
}

答案 1 :(得分:0)

标准C99部分$ 6.7.2.1表示为,

struct-declarator-list:
     struct-declarator
     struct-declarator-list , struct-declarator

struct-declarator:
     declarator
     declarator_opt : constant-expression

您可以使用, as,

声明struct位字段成员
   struct msg_hdr0 {
     uint8_t a : 1, b : 1, e : 4, f : 2;
   };

答案 2 :(得分:0)

对于您如何使用位字段的问题,以下代码可能有所帮助。位字段在C中是标准的,当int的整个大小不需要存储值时使用,并且特定的位数足以保存值,这样它们可以节省内存,如下所示。在另一个答案中已经有一个链接,为什么不使用位字段,但为了理解这个目的。

#include <stdio.h>
struct a
{
    unsigned int a;
    unsigned int b;
};
struct b
{
    unsigned int a : 2; /* unsigned int a:2, */
                        /*              b:3;  */
    unsigned int b : 3;
};
int main(void) {
    struct b p;
    p.a = 3; /* This member can hold just 2 bits */
    p.b = 7;/* This member can hold just 3 bits */
    printf("%d\n",sizeof(struct a)); /* Size of struct is 8 bytes */
    printf("%d\n",sizeof(struct b)); /* size of struct is 4 bytes using bit fields*/
    printf("%d\n",p.a);
    printf("%d\n",p.b);
    return 0;
}