【发布时间】:2010-07-13 19:27:53
【问题描述】:
(问题与我之前的问题here、here、here和here有关)。
我正在维护一个多年前从 DOS 移植到 Windows 的非常古老的应用程序,但许多旧的 C 约定仍然沿用。
一个特殊的约定是 setBit 和 clrBit 宏:
#ifndef setBit
#define setBit(word, mask) word |= mask
#endif
#ifndef clrBit
#define clrBit(word, mask) word &= ~mask
#endif
我发现我可以将变量声明为枚举类型并将我的变量设置为等于定义的枚举值之一。
enum SystemStatus
{
SYSTEM_ONLINE = BIT0,
SYSTEM_STATUS2 = BIT1,
SYSTEM_STATUS3 = BIT2,
SYSTEM_STATUS4 = BIT3
};
有BIT0 = 0x00000001、BIT1 = 0x00000002等
SystemStatus systemStatus;
systemStatus = SYSTEM_ONLINE
在您看来,使用 setBit 和 clrBit 宏更像 C 还是 C++ - 将变量简单地声明为枚举类型并摆脱所有旧的 setBit/clrBit 东西会更好吗?
【问题讨论】:
-
正如尼尔指出的那样,它们并不完全相同。也就是说,在 C++ 中,您永远不应该将宏用作函数,而应使用模板函数。此外,对于一组位,只需使用
std::bitset并完成它。 (更好的界面。) -
为了以这种方式枚举所有可能的状态,您需要 2^(位数)状态。可能不是最干净的解决方案。
-
@Justin 这就是比特的本质。
-
Changeling 似乎在描述的是一个“单热”状态机,其中每个位代表一个状态,并且任何时候只允许设置一个位(所有其他组合都是非法的,并且会被
switch块中的default子句捕获)。然而,这种符号在固件之外很少见,因为它的主要目标是通过添加寄存器来降低组合逻辑的复杂性,并且在纯软件状态机中并没有真正的区别。