【发布时间】:2013-02-13 12:49:24
【问题描述】:
我指的是来自开源项目 tig 的代码示例。这是一个很棒的工具!
文件:tig.c
我正在努力寻找如下定义 request 枚举的原因:
enum request {
#define REQ_GROUP(help)
#define REQ_(req, help) REQ_##req
/* Offset all requests to avoid conflicts with ncurses getch values. */
REQ_UNKNOWN = KEY_MAX + 1,
REQ_OFFSET,
REQ_INFO,
/* Internal requests. */
REQ_JUMP_COMMIT,
#undef REQ_GROUP
#undef REQ_
};
甚至还有结构..
static const struct request_info req_info[] = {
#define REQ_GROUP(help) { 0, NULL, 0, (help) },
#define REQ_(req, help) { REQ_##req, (#req), STRING_SIZE(#req), (help) }
REQ_INFO
#undef REQ_GROUP
#undef REQ_
};
可以看出REQ_GROUP 已被#defined 多次造成混乱.. 至少对我而言。好吧,我知道这样做可能有充分的理由.. 使用宏在代码中隐藏枚举/结构定义的实际原因是什么?
【问题讨论】:
-
为了了解发生了什么,我经常发现使用 gcc 选项
-dNI -E编译源代码很有用,这会产生预处理的源代码,但会显示宏定义,而不会扩展宏并且#include语句完好无损。 -
下面的答案都有。这种策略的通用名称是“X 宏”,维基百科有一个关于它的页面:en.wikipedia.org/wiki/X_Macro 和 Dobbs 博士一样:drdobbs.com/cpp/the-x-macro/228700289
-
@Vicky drdobbs 链接是一颗宝石!谢谢!