C宏 - 未在此范围错误中声明

时间:2013-10-07 13:04:38

标签: c macros

#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'。

上面的宏有什么问题?

2 个答案:

答案 0 :(得分:9)

您需要x两侧的token-pasting operator才能使其正确替换。

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

答案 1 :(得分: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());   \
  }                                                                \
}