微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Enum vs Macro States C

(问题与我以前的问题 here,here,herehere有关).

我正在维护一个非常古老的应用程序,该应用程序在几年前从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; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐