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

mar*_*ner 7 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()); \
  } \
}
Run Code Online (Sandbox Code Playgroud)

上面的宏尝试设置一个请求成员,如果它不是空的,但是我得到以下错误:当我使用这个宏时,在这个范围内没有声明'set_x_for_serving'.

上面的宏有什么问题?

Bri*_*ain 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()); \
  } \
}
Run Code Online (Sandbox Code Playgroud)


abe*_*nky 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());   \
  }                                                                \
}
Run Code Online (Sandbox Code Playgroud)