因为需要代码美观,我要将所有参数检查的动作封装起来;直接上代码:
头文件:
#define CHECK_PARAMS(params, ...) {if(!checkSpecifiedParams(¶ms, __VA_ARGS__, "va_end"))return LOST_SPECIFIED_PARAM;}
bool checkSpecifiedParams(const PARAMS*, ...);
最后加入参数“va_end”的原因是我无法知道变参何时结束,故而添加结束标记
__VA_ARGS__,这个宏可以取到变参,给c++编译器赞一个!
cpp实现:
bool checkSpecifiedParams(const PARAMS* params, ...)
{
va_list paramList;
va_start(paramList, params);
while(paramList != NULL)
{
char* key = va_arg(paramList, char*);
if(strcmp(key, "va_end") == 0)
break;
if(!params->contains(key))
return false;
}
va_end(paramList);
return true;
}
这里说明一下:
va_start(paramList, params);通过params,取得紧随其后参数的地址
va_end(paramList);将地址置空
使用方式:
CHECK_PARAMS(params, "file_id", "group_id", "history_id");