#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”。
上面的宏有什么问题?
您需要在两侧使用令牌粘贴运算符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()); \
} \
}
它看起来像在一个宏调用中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()); \
} \
}