在第 32 周的C++ Guru 中(谈到“合法”使用预处理器宏),最后一个示例显示了一个在DERR_ENTRY
没有任何实际实现的情况下调用的宏:
DERR_ENTRY 和相关宏的实现留给读者。
这个宏应该替换这个:
// For outsiders:
enum Errors {
ERR_OK = 0, // No error
ERR_INVALID_PARAM = 1 // <description>
...
}
// For the module's internal use:
map<Error,const char*> lookup;
lookup.insert( make_pair( Error(0), "No error" ) );
lookup.insert( make_pair( Error(1), "<description>" ) );
有了这个:(更简单)
DERR_ENTRY( ERR_OK, 0, "No error" ),
DERR_ENTRY( ERR_INVALID_PARAM, 1, "<description>" ),
//...
根据 GotW 的作者:
我们希望在不定义实际信息(代码/消息对)两次的情况下同时拥有这两种表示形式。使用宏魔法,我们可以简单地编写如下错误列表,在编译时创建适当的结构
但是我看不到同时定义枚举条目和映射条目的简单方法。或者也许有未知的语法我不知道可以解决这个问题?
那么,您将如何实现 DERR_ENTRY 宏?
注意:请记住 GotW #32 应该说明预处理器宏的强大功能。