#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'.
上面的宏有什么问题?
您需要两侧的令牌粘贴操作符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)
它看起来像是在宏调用中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)