我正在处理一个在不同处理器上运行的文件,因此头文件会根据硬件的不同而变化。我的程序需要接收一个索引,如果它是特定枚举的有效索引,则使用它,否则使用默认值。
我需要检查它是否是此枚举的有效索引。但是,枚举的处理器与处理器略有不同。我为每个芯片都有一个头文件,所以我不知道定义了多少索引。下面是它的大致外观:
typedef enum
{
POWER_LEVEL_0
POWER_LEVEL_1,
POWER_LEVEL_2,
POWER_LEVEL_3,
POWER_LEVEL_4
} power_type;
我需要能够测试是否定义了接收到的索引,如下所示:
int input;
...
if( exists_in_power_type(input) )
//accept the value
else
//use default value
我知道索引的数量将在大约4到7的范围内,如果我在一个可能有8个或更多电源选项的新处理器上运行这个项目,这个数字可能会增加。在这种情况下,我希望我的程序是可移植的,并且只需在该处理器的新标头中定义一个同名的枚举。
这个问题可能会简单一点,因为枚举值从0开始,以1为增量。有没有办法在不知道枚举定义的情况下获得枚举的长度/最大值?有没有类似的工作我可以在这里使用?
发布于 2019-05-29 22:55:08
没有跨平台的方法来确定特定enum
的最大合法枚举值。但是,您可以通过在所有其他值之后引入一个虚拟枚举值来绕过此问题:
typedef enum
{
POWER_LEVEL_0
POWER_LEVEL_1,
POWER_LEVEL_2,
POWER_LEVEL_3,
POWER_LEVEL_4,
ILLEGAL_POWER_LEVEL // Not to be used directly; must be last
} power_type;
现在,您可以按如下方式编写helper函数:
bool exists_in_power_type(power_type value) {
return 0 <= value && value < ILLEGAL_POWER_LEVEL;
}
只要ILLEGAL_POWER_LEVEL
是最后一个枚举值,这种方法就会检查您是否为value
分配了与某个枚举匹配的值。
希望这能有所帮助!
https://stackoverflow.com/questions/56369464
复制相似问题