【问题标题】:When using bitfield union to replace bitmask, is accessing inactive member, okay or undefined?使用位域联合替换位掩码时,访问非活动成员是正常还是未定义?
【发布时间】:2014-11-08 00:17:18
【问题描述】:

this question 我了解到匿名结构和联合是 C11 标准的一部分(来自 cmets)。然后我想用bitfield union代替bitmask可能是个好主意,结果发现别人已经发了一个问题并显示an example,和我的想法一模一样。并且该问题的答案同意使用位域联合方法替换位掩码的安全性。但是,据我了解,the post there 的答案否认了访问非活动联合成员的安全性,称访问非活动联合成员是未定义的行为。我觉得这两个问题的答案是矛盾的:

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

我说的对吗?还是我误解了这些答案?

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

【问题讨论】:

  • 我认为你是对的,我的问题已经解决了。谢谢:) @Mat

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


【解决方案1】:

您是对的:在某些情况下,联合位域可能足以满足您的目标,但作为一般方法它不便携且不安全,因为机器字是如何在内存中存储或访问的.

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多