位元欄位(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;
}
每一個位元欄位在緊跟著的冒號後指定使用的位元數量,在允許的狀況下,連續宣告的位元欄位成員會緊鄰著被配置空間。
位元欄位成員不可被 &
取址,也不可為靜態成員。