使用带有联合的位字段是否有效?

ami*_*n__ 10 c structure unions bit-fields

我使用了具有这样结构的位字段,

struct
{
       unsigned int is_static: 1;
       unsigned int is_extern: 1;
       unsigned int is_auto: 1;
} flags;
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否可以通过联合完成这样我修改代码,如,

union
{
       unsigned int is_static: 1;
       unsigned int is_extern: 1;
       unsigned int is_auto: 1;
} flags;
Run Code Online (Sandbox Code Playgroud)

我找到了带有union的bit字段,但是从输出中可以理解,union中的所有字段都被赋予了一个位.现在我看到使用带有union的位字段并不是错误的,但在我看来,像这样使用它在操作上是不正确的.那么答案是什么 - 将bit字段与union结合使用是否有效?

Spa*_*key 20

这是有效的,但正如你所发现的那样,你在那里做的方式没有用.

你可能会这样做,所以你可以使用标志同时重置所有位.

union {
    struct {
        unsigned int is_static: 1;
        unsigned int is_extern: 1;
        unsigned int is_auto: 1;
    };
    unsigned int flags;
};
Run Code Online (Sandbox Code Playgroud)

或者您可能会这样做:

union {
    struct {
        unsigned int is_static: 1;
        unsigned int is_extern: 1;
        unsigned int is_auto: 1;
    };
    struct {
        unsigned int is_ready: 1;
        unsigned int is_done: 1;
        unsigned int is_waiting: 1;
    };
};
Run Code Online (Sandbox Code Playgroud)

  • 假设您需要匿名结构,我添加了一些分号。还要注意,它们不是标准C。在gcc中,必须使用`-fms-extensions`才能起作用。 (2认同)

bin*_*inW 17

给你一把枪和子弹.用脚射击自己可以吗?当然不是,但如果你愿意,没有人可以阻止你这样做.

我的观点是,就像枪支和子弹一样,联合和位域是工具,它们的目的,用途和"滥用".因此,如上所述,使用联合中的位域是完全有效的C,但却是无用的代码.union中的所有字段共享相同的内存,因此您提到的所有位域基本上都是相同的标志,因为它们共享相同的内存.

  • 这个比喻比OP问题中的代码更无用。 (6认同)
  • 如果这些位在不同时间意味着不同的东西,那么非常有用,就像微控制器上的硬件寄存器的情况一样。这也经常出现在文件格式中,作为一种节省空间的方法,通过将不同类型的数据填充到一个数组中并使用一个标志来告诉每个元素的类型。人们根据有限的个人经验认为自己知道如何使用语言功能,这确实是一个问题。 (3认同)