我正在维护一个非常古老的应用程序,该应用程序几年前从DOS移植到Windows,但许多旧的C约定仍在继续.
一个特定的约定是setBit和clrBit宏:
#ifndef setBit
#define setBit(word, mask) word |= mask
#endif
#ifndef clrBit
#define clrBit(word, mask) word &= ~mask
#endif
Run Code Online (Sandbox Code Playgroud)
我发现我可以将变量声明为枚举类型,并将我的变量设置为等于所定义的枚举值之一.
enum SystemStatus
{
SYSTEM_ONLINE = BIT0,
SYSTEM_STATUS2 = BIT1,
SYSTEM_STATUS3 = BIT2,
SYSTEM_STATUS4 = BIT3
};
Run Code Online (Sandbox Code Playgroud)
有了BIT0 = 0x00000001
,BIT1 = 0x00000002
等.
SystemStatus systemStatus;
systemStatus = SYSTEM_ONLINE
在您看来,使用setBit和clrBit宏更像C或C++之类的 - 并且最好简单地将变量声明为枚举类型并删除所有旧的setBit/clrBit内容吗?
小智 7
不,你不能 - 分配枚举值会覆盖整个值,而宏会改变现有值中的位.什么是BIT0,BIT1等?这就像定义INT0,INT1等 - 可怕的做法.
最重要的是,旧的C风格代码会给你带来什么问题吗?如果没有,请应用这个历史悠久的规则 - 如果没有破坏,请不要修复它.
setBit和clrBit很好,虽然我会将它们转换为C++中的内联函数.如果状态位彼此独立,它们将非常方便,例如:
SystemStatus systemStatus = SYSTEM_ONLINE | SYSTEM_STATUS3;
Run Code Online (Sandbox Code Playgroud)
是一个有效的设置.
systemStatus = clrBit(systemStatus, SYSTEM_STATUS3);
systemStatus = setBit(systemStatus, SYSTEM_STATUS4);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1460 次 |
最近记录: |