#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'。
上面的宏有什么问题?
答案 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()); \
} \
}