c语言的位域做标志位,用C语言进行位域操作

在C中测试和设置单个整数的经典问题可能是最常见的中级编程技能之一。您可以设置和测试简单的位掩码,例如

unsigned int mask = 1<<11;

if (value & mask) {....} // Test for the bit

value |= mask;    // set the bit

value &= ~mask;   // clear the bit

一篇有趣的博客文章认为这是容易出错的,难以维护的并且是错误的做法。C语言本身提供了类型安全和可移植的位级别访问:

typedef unsigned int boolean_t;

#define FALSE 0

#define TRUE !FALSE

typedef union {

struct {

boolean_t user:1;

boolean_t zero:1;

boolean_t force:1;

int :28;                /* unused */

boolean_t compat:1;     /* bit 31 */

};

int raw;

} flags_t;

int

create_object(flags_t flags)

{

boolean_t is_compat = flags.compat;

if (is_compat)

flags.force = FALSE;

if (flags.force) {

[...]

}

[...]

}

但这让我畏缩了。

我和我的同事对此颇有意思的争论仍未解决。两种样式都可以使用,并且我认为经典的位掩码方法简单,安全且清晰。我的同事都认为这是普通且容易的,但是位域联合方法值得用额外的几行内容来使其变得更加便携和安全。

双方还有其他论点吗?特别是可能存在字节序方法可能遗漏但可能采用字节序的错误,但结构方法是否安全?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值