(问题与我以前的问题
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等.
在您看来,使用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 举报,一经查实,本站将立刻删除。