Flags, enum (C) - Stack Overflow
another way of storing flags is to not bother with the underlying type at all. when using an enum, the enum values are stored by default into an unsigned int, which is 32 bits on a common computer. this gives you with only 32 possible flags: while certainly much, there are some cases where it is not sufficient.
now you can define your flag set this way:
typedef struct{ int takes_damage : 1; int grabbable : 1; int liquid : 1; int some_other : 1;} flags;if you never encountered this, the ': 1' part tells the compiler to only use 1 bit to store this struct member.
now you can define a variable to hold the flags, and work with those flags:
flags myflags = {1,0,0,1}; // defines a variable holding a set of flags, with an initial value of takes_damage & some_othermyflags.liquid = 1; // change the flags to include the liquidif ( myflags.takes_damage ) // test for one flag apply_damage();if ( myflags.liquid && myflags.some_other ) // test for multiple flags show_strange_behavior();this method allows you to define any number of flags, without limitation, and you can extend your flag set at any time without fearing an overflow. the drawback is that testing a subset of the flags is more cumbersome and necessitate more code.
原本是在看 stackoverflow 上面對 enum 的常用法,無意中看到其中一個回覆,用「:1」可以告訴 compiler 只用 1 bit 去存…,這樣就不會被限制在一個 enum flag var 只用有 32 種 flags。