Enum vs Macro States C++

3 c++ macros enums

(问题与我先前的问题有关,这里,这里,这里这里).

我正在维护一个非常古老的应用程序,该应用程序几年前从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风格代码会给你带来什么问题吗?如果没有,请应用这个历史悠久的规则 - 如果没有破坏,请不要修复它.

  • 除非它们是第0,第1,第2等命令位的常量.那不是坏事.IMO比`0x00004000`更容易阅读. (3认同)
  • 而不是'BIT0`,`BIT1`等,通常的做法(至少在嵌入式系统中用C语言)是使用宏:`#define BIT(n)(1 <<(n))`.然后另一组`#define`宏将位值分配给字段名称,例如`#define SPI_START BIT(0)`,其中这些字段名称尽可能接近芯片数据表中的字段名称.另外,`setBit`最好命名为`setBits`,因为你可以一次设置几个位(例如`setBits(spiCtrlReg,SPI_START | SPI_CONT);`. (2认同)

Jam*_*ran 6

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)