c - C 中枚举标志的替换

标签 c enums 32-bit flags c89

我在 C 编程语言中使用了很多枚举标志。一个非常好的解决方案。但我现在有一个问题:我需要实现超过 32 个标志选项,它是 1 << 32 ,即 enum无法保持,因为它太大了。

那么,我该如何解决这个问题呢?也许我应该使用 #define而不是enumunsigned long int而不是unsigned int ?这会好吗?一个struct 使用位域对我来说不是一个有效的解决方案,因为它不是 C ANSI 标准代码。

最佳答案

您应该查看 static const vs #define in C .

听起来好像您正在使用一般形式的枚举:

enum
{
    FLAG_A = 0x00000001, FLAG_B = 0x00000002, FLAG_C = 0x00000004, FLAG_D = 0x00000008,
    ...
};

您还可以通过按位运算将这些不同的枚举值组合成一个(32 位)unsigned int 值。 现在你已经达到了极限;您有超过 32 个标志(我相信它们的命名比我的示例中更有意义)。

您可以决定开始一系列新的枚举,使用第二个 32 位(无符号)整数来存储位。这样做的优点是可以将符号保留在可调试程序中(与#define 常量不同,即使在可调试程序中也很少可用)。缺点是您可能需要在之前传递一个值的地方传递两个值。

如果必须将标志保留在单个变量中,则需要考虑是否使用 unsigned long long 更好,或者可能使用具有两个 unsigned 的结构int 值可以工作。

我同意最好不要使用位域,尽管它们可能工作得足够好。我还会煞费苦心地避免使用 #define,并且可能会使用两个 32 位变量或一个结构。很大程度上取决于您的代码库以及这些值的使用范围。

关于c - C 中枚举标志的替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17758586/

相关文章:

c - 警告指针和整数之间的数组比较

C如何访问结构体中的结构体成员?

c++ - #ifdef 用于 32 位平台

c - 如何在 C 中将指针重新分配给较小的数组?

ios - Eureka Forms 基于 SegmentedRow 隐藏验证错误

java - 打印枚举的名称

c++ - C++ 枚举中的数组

将 32 位数字转换为 16 位数字

opengl - 将 PNG 纹理加载到 OpenGL

c - recv 返回旧数据