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;
Run Code Online (Sandbox Code Playgroud)
是什么:1和:8意味着什么?
Joe*_*ish 64
那些是位字段.基本上,冒号后面的数字描述了字段使用的位数.以下是MSDN引用位域的引用:
constant-expression以位为单位指定字段的宽度.声明符的类型说明符必须是unsigned int,signed int或int,而constant-expression必须是非负整数值.如果值为零,则声明没有声明符.不允许使用位字段数组,位字段指针和返回位字段的函数.可选的声明符命名位字段.位字段只能声明为结构的一部分.运算符地址(&)不能应用于位域组件.
无法引用未命名的位字段,并且它们在运行时的内容是不可预测的.它们可以用作"虚拟"字段,用于对齐目的.宽度指定为0的未命名位域保证struct-declaration-list中跟随它的成员的存储在int边界上开始.
此示例定义名为screen的二维结构数组.
struct
{
unsigned short icon : 8;
unsigned short color : 4;
unsigned short underline : 1;
unsigned short blink : 1;
} screen[25][80];
Run Code Online (Sandbox Code Playgroud)
编辑:来自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));
Run Code Online (Sandbox Code Playgroud)
test1:4
test2:2
test3:1
test4:4
小智 15
我也遇到了冒号,但在我的上下文中,位字段没有意义.所以我做了一些挖掘.这种表示法也用于赋值 - 在我的特定情况下指向函数的指针.
资料来源:http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm
以下是一个示例和摘要来解释.
" 有一个gcc扩展,使得分配给这个结构更方便.你会在现代驱动程序中看到它,并且可能会让你感到惊讶.这就是分配给结构的新方式:"
struct file_operations fops = {
read: device_read,
write: device_write,
open: device_open,
release: device_release
};
Run Code Online (Sandbox Code Playgroud)
C99(旧的,兼容的)方式如下:
struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39301 次 |
| 最近记录: |