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)で置き換えXXられるため、マクロを3回HTTP_ERRNO_GEN呼び出します。HTTP_ERRNO_GEN(n, s)

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)単純に最初の引数の実際のテキストを取得し、それを(##nHPEの前に外し、最後にコンマを付けて連結します。したがって、上記の3つのコマンドは、次の3つの出力を生成します。

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 に答える