7
#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \
  if (!var.empty()) { \
    set_##x_for_serving(r->request, var.data(), var.length()); \
  } \
}

如果上面的宏不为空,则尝试设置请求成员,但我收到以下错误:使用此宏时未在此范围内声明“set_x_for_serving”。

上面的宏有什么问题?

4

2 回答 2

9

您需要在两侧使用令牌粘贴运算符x才能使其正确替换。

#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \
  if (!var.empty()) { \
    set_##x##_for_serving(r->request, var.data(), var.length()); \
  } \
}
于 2013-10-07T13:16:20.950 回答
5

它看起来像在一个宏调用中SET_NONEMPTY(foobar),你期望它set_##x_for_serving会扩展为set_foobar_for_serving.

那是对的吗?

如果是这样,则该短语x_for_serving单个标记x预处理器不会将其视为要替换的项目。

我想你想要set_##x##_for_serving

#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \
  if (!var.empty()) {                                              \
    set_##x##_for_serving(r->request, var.data(), var.length());   \
  }                                                                \
}
于 2013-10-07T13:16:29.643 回答