ビットフラグの楽しさを発見しました。C でのビットフラグの使用に関する「ベスト プラクティス」に関連する質問がいくつかあります。Web で見つけたさまざまな例からすべてを学びましたが、まだ疑問があります。
スペースを節約するために、構造体 ( ) で単一の 32 ビット整数フィールドを使用して、A->flag
ブール型プロパティのいくつかの異なるセットを表しています。全部で 20 の異なるビットが#define
d です。これらのいくつかは、真の存在/不在フラグです (STORAGE-INTERNAL と STORAGE-EXTERNAL)。2 つ以上の値を持つものもあります (たとえば、相互に排他的な形式のセット: FORMAT-A、FORMAT-B、FORMAT-C)。特定のビットを設定する (同時に相互に排他的なビットをオフにする) マクロを定義しました。特定のビットの組み合わせがフラグに設定されているかどうかをテストするためのマクロも定義しました。
ただし、上記のアプローチで失われるのは、列挙型によって最もよくキャプチャされるフラグの特定のグループ化です。関数を記述する場合、関数定義が見栄えがするように列挙型 (STORAGE-TYPE や FORMAT-TYPE など) を使用したいと考えています。パラメータを渡すためにのみ列挙型を使用し、フラグの設定とテストには #defined マクロを使用することを期待しています。
A->flag
(a) (32 ビット/64 ビット プラットフォーム間で) 移植可能な方法でフラグ ( ) を 32 ビット整数として定義するにはどうすればよいですか?A->flag
(b) 保存方法と#define
d 定数と列挙型の潜在的なサイズの違いについて心配する必要がありますか?(c) 私は物事を不必要に複雑にしていますか? つまり、パラメーターを通常の s
#define
として渡すために d 定数を使用することに固執する必要がありますか?int
このすべてで、他に何を心配する必要がありますか?
わかりにくい質問で申し訳ありません。潜在的な問題についての私の無知を反映しています。