1

宏定义:

#define HTTP_ERRNO_MAP(XX)                                           \
  /* No error */                                                     \
  XX(OK, "success")                                                  \
                                                                     \
  /* Callback-related errors */                                      \
  XX(CB_message_begin, "the on_message_begin callback failed")       \
  XX(CB_url, "the on_url callback failed")                           \


/* Define HPE_* values for each errno value above */
#define HTTP_ERRNO_GEN(n, s) HPE_##n,
enum http_errno {
  HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)
};
#undef HTTP_ERRNO_GEN

用“gcc -E”展开后,

enum http_errno {
  HPE_OK, HPE_CB_message_begin, HPE_CB_url,};

宏如何扩展为结果?

4

1 回答 1

1

HTTP_ERRNO_MAP(XX)将替换XXHTTP_ERRNO_GEN并因此调用HTTP_ERRNO_GEN(n, s)宏 3 次:

HTTP_ERRNO_GEN(OK, "success")
HTTP_ERRNO_GEN(CB_message_begin, "the on_message_begin callback failed")
HTTP_ERRNO_GEN(CB_url, "the on_url callback failed")

HTTP_ERRNO_GEN(n, s)只需获取第一个参数的实际文本并将其连接起来 ( ##n),HPE前面有一个,最后有一个逗号。因此,上面的三个命令将产生以下三个输出:

HPE_OK,
HPE_CB_message_begin,
HPE_CB_url,

因此,当被预处理器扩展时,

enum http_errno {
  HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)
};

变为(+- 空格):

enum http_errno {
   HPE_OK,
   HPE_CB_message_begin,
   HPE_CB_url,
};
于 2012-09-08T03:56:25.657 回答