位字段


位字段(Bit-field)就是数据成员,然而被指定了可存放的位数量,也就是用来存放位数据的值域,必须是整数或枚举,通常使用unsigned,例如unsigned int

#include <stdio.h>
#include <stdbool.h>

enum modes {READ = 0b01, WRITE = 0b10, READ_WRITE = 0b11};

typedef unsigned int Bit;
typedef const char* String;
typedef struct  {
    Bit modified : 1;  // 使用 1 位
    Bit mode     : 2;  // 使用 2 位

    String filename;
} File;

bool isRead(File *file) {
        return file->mode & READ;
    }

    bool isWrite(File *file) {
        return file->mode & WRITE;
    }    

    void write(File *file, String text) {
        if(!isWrite(file)) {
            printf("%s:read-only", file->filename);
        }
        file->modified = 0b01;
        // ...
    }

int main() { 
    File foo1 = {.filename = "foo1", .mode = READ};
    File foo2 = {.filename = "foo2", .mode = READ_WRITE};

    write(&foo1, "XD");

    return 0; 
}

每一个位字段在紧跟着的冒号后指定使用的位数量,在允许的状况下,连续定义的位字段成员会紧邻着被配置空间。

位字段成员不可被&取址,也不可为静态成员。


展开阅读全文