我刚刚发现了位标志的乐趣。我有几个关于在 C 中使用位标志的“最佳实践”的问题。我从网上找到的各种示例中学到了一切,但仍有疑问。
为了节省空间,我在 struct ( A->flag
) 中使用单个 32 位整数字段来表示几个不同的布尔属性集。总共有 20 个不同的位是#define
d。其中一些是真正的存在/不存在标志(STORAGE-INTERNAL vs. STORAGE-EXTERNAL)。其他的有两个以上的值(例如互斥格式集:FORMAT-A、FORMAT-B、FORMAT-C)。我已经定义了用于设置特定位的宏(同时关闭互斥位)。我还定义了用于测试标志中是否设置了特定位组合的宏。
但是,在上述方法中丢失的是最能被枚举捕获的特定标志分组。对于编写函数,我想使用枚举(例如,STORAGE-TYPE 和 FORMAT-TYPE),这样函数定义看起来不错。我希望仅使用枚举来传递参数和#defined 宏来设置和测试标志。
(a) 如何
A->flag
以可移植方式(跨 32 位/64 位平台)将标志 ( ) 定义为 32 位整数?(b) 我是否应该担心
A->flag
与#define
d 常量与枚举的存储方式的潜在大小差异?(c) 我是否让事情变得不必要地复杂,这意味着我应该坚持使用
#define
d 常量作为普通int
s 传递参数吗?在这一切中我还应该担心什么?
对于这个表述不清的问题,我深表歉意。这反映了我对潜在问题的无知。