C 将位字段与union一起使用是否有效?

C 将位字段与union一起使用是否有效?,c,structure,bit-fields,unions,C,Structure,Bit Fields,Unions,我使用了这样的结构的位域 struct { unsigned int is_static: 1; unsigned int is_extern: 1; unsigned int is_auto: 1; } flags; 现在我想知道这是否可以通过一个联合来实现,所以我修改了如下代码: union { unsigned int is_static: 1; unsigned int is_extern: 1; un

我使用了这样的结构的位域

struct
{
       unsigned int is_static: 1;
       unsigned int is_extern: 1;
       unsigned int is_auto: 1;
} flags;
现在我想知道这是否可以通过一个联合来实现,所以我修改了如下代码:

union
{
       unsigned int is_static: 1;
       unsigned int is_extern: 1;
       unsigned int is_auto: 1;
} flags;

我发现union的位字段可以工作,但是union中的所有这些字段都被赋予了一个位,正如我从输出中理解的那样。现在,我发现将位字段与并集一起使用并不是错误的,但在我看来,这样使用它在操作上是不正确的。那么,答案是什么?将位字段与union一起使用是否有效?

您将得到一把枪和一颗子弹。用它射自己的脚可以吗?当然不是,但是如果你想,没有人能阻止你这么做


我的观点是,就像枪和子弹一样,联盟和比特场都是工具,它们有自己的目的、用途和“滥用”。所以,正如您在上面所写的,在并集中使用位字段是完全有效的C语言,但这是一段无用的代码。union中的所有字段共享相同的内存,因此您提到的所有位字段本质上都是相同的标志,因为它们共享相同的内存。

这是有效的,但正如您所发现的,没有您在那里使用的方式

您可以这样做,以便可以使用标志同时重置所有位

union {
    struct {
        unsigned int is_static: 1;
        unsigned int is_extern: 1;
        unsigned int is_auto: 1;
    };
    unsigned int flags;
};
或者你可以这样做:

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;
    };
};

请问,什么操作不正确?我添加了一些分号,假设您需要匿名结构。还要注意的是,它们不是标准的C。在gcc中,您必须使用
-fms扩展才能工作。这个比喻比OP问题中的代码更无用。