使用bitfield union替换位掩码时,是访问非活动成员,还是未定义?

时间:2014-09-14 08:55:19

标签: c++ c undefined-behavior unions bitmask

this question我了解到,匿名结构和工会已成为C11标准的一部分(来自评论)。然后我认为使用bitfield union替换位掩码可能是一个好主意,我发现其他人已经发布了一个问题并显示an example,这与我的想法完全相同。并且该问题的答案同意使用bitfield union方法替换位掩码的安全性。但是,据我所知,the post there的答案拒绝访问非活动联盟成员的安全性,并说访问非活动联盟成员是未定义的行为。我认为这两个问题的答案是矛盾的:

仅使用the example there,修改.user后,.raw的值将变为未定义(通过the post的回答)。所以我认为使用bitfield union方法替换位掩码是不安全的。

我是对的吗?或者我误解了这些答案?

编辑:如果我的问题的答案对于C和C ++是不同的,我希望知道它们。

1 个答案:

答案 0 :(得分:3)

你是正确的:可能存在联合位域可能满足你的目标的情况,但作为一般方法它不便携且安全,因为存储或访问机器字的方式在记忆中。

C11允许您根据需要重新解释数据,而C ++ 11明确禁止这样做(9.5.1)。如果您希望机器字位在任何地方以特定顺序排列,您就不能期望拥有可移植代码。

如果以字节方式读/写它们就没有问题,但只要其他平台上的可移植性和安全性受到威胁,您就不能真正期望在存储时找到相同的内部位格式大端机器或小端机器上的整数。