C中的位域掩码

Gra*_*dpa 5 c atomic bit-fields

在C中是否有可移植的方法来在编译时找出位字段的掩码?

理想情况下,我希望能够原子地清除这样的字段:

struct Reference {
    unsigned age : 3;
    unsigned marked : 1;
    unsigned references : 4;
};

struct Reference myRef;
__sync_and_and_fetch(&myRef, age, ~AGE_MASK);
Run Code Online (Sandbox Code Playgroud)

否则我必须取消对结构的锁定,这比我想要的更重.

Kei*_*all 2

或者,如果你真的想要面具:

union Reference {
  unsigned asWord;
  struct {
    unsigned age : 3;
    unsigned marked : 1;
    unsigned references : 4;
  } asFields;
}

Reference agemask_ref;
agemask_ref.asFields = (typeof(agemask_ref.asFields)){0, -1, -1};
unsigned agemask = agemask_ref.asWord;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“typeof()”是 GCC 扩展,不能移植到其他编译器。 (2认同)