加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Enum vs Macro States C

发布时间:2020-12-16 10:50:24 所属栏目:百科 来源:网络整理
导读:(问题与我以前的问题 here,here,here和 here有关). 我正在维护一个非常古老的应用程序,该应用程序在几年前从DOS移植到Windows,但很多旧的C约定仍在继续. 一个特定的约定是setBit和clrBit宏: #ifndef setBit#define setBit(word,mask) word |= mask#endif#if
(问题与我以前的问题 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东西会更好吗?

解决方法

我认为你的目的令人困惑.枚举是关于设置要用作标志的值. setBit和clrBit是关于数据操作的.这些数据可能恰好是一面旗帜,但这确实是两种观念之间唯一的关系.

话虽这么说,宏肯定不是C的做事方式.您将使用内联函数.例如:

template<typename T>
inline T& setBit(T& word,T mask) { return word |= mask; }

template<typename T>
inline T& clrBit(T& word,T mask) { return word &= ~mask; }

编辑以抵挡挑剔者:

这只是您如何实现这些功能的一个示例.您不需要使用模板,可以使用两个模板参数而不是1,如果需要,可以使用void函数或值而不是引用(尽管它会丢失一些原始语义).重点是获得类型安全的好处,这在宏中是不会找到的(在宏的许多其他缺点中). http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.5

编辑:这是一个无效的非模板版本,供比较

inline void setBit(unsigned int word,unsigned int mask) { word |= mask; }

inline void clrBit(unsigned int word,unsigned int mask) { word &= ~mask; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读