可变参数的宏
- 函数声明
int CheckEnv(int count, ...);
函数声明与普通函数声明方式类似,只是参数列表中第一个参数 count 标识参数数量,…为实际参数列表 - 参数读取
va_list ap;
va_start(ap, count);
for (int i = 0; i < count; i++)
{
if (Model->GetType() == va_arg(ap, pfcModelType))
{
EnvFlag = 1;
break;
}
}
va_end(ap);
步骤:
(1) 定义参数:参数格式(int count,…)
(2) 函数定义中创建一个 va_list 变量
(3) 初始化:va_start(ap, count);
(4) 循环将各个参数进行相加
(5) 清理:调用清理 va_end(va_list); //清理内容 最后调用
上述步骤的实现需要使用到四个宏:va_list、va_start(va_list, arg)、va_arg(va_list, type)、va_end(va_list)这些宏在头文件 stdarg.h 中声明定义。因此使用时需要包含该头文件。
注意:该方法极不安全! 例如 count 个数为 5 或 7 个 实际参数个数为 6 个 就会发生严重错误!!!
3. 完整代码
int CheckEnv(int count, ...)
{
pfcSession_ptr session = pfcGetProESession();
pfcModels_ptr Models = session->ListModels();
pfcModel_ptr Model = session->GetCurrentModel();
pfcModelType ModelType;
int EnvFlag = 0;
if (Models->getarraysize() == 0 || Model == NULL)
{
session->UIDisplayLocalizedMessage(MSGFILE, "Model is not found in current session!", NULL);
}
else if (count == 0)
{
if (Model->GetType() == pfcMDL_DRAWING)
{
EnvFlag = 1;
}
}
else
{
va_list ap;
va_start(ap, count);
for (int i = 0; i < count; i++)
{
if (Model->GetType() == va_arg(ap, pfcModelType))
{
EnvFlag = 1;
break;
}
}
va_end(ap);
}
if (EnvFlag == 0)
{
LOG(LOG_WARNING) << "ModelType is error!";
// session->UIDisplayLocalizedMessage(MSGFILE, "ModelType is error!", NULL);
}
return EnvFlag;
}
initializer_list 标准库类型
该方法安全性更高,但是需要 C++11 特性支持。目前在 Creo 二次开发过程中,为了兼容低版本插件使用问题,使用 Creo3.0 作为基础版本,对应编译环境为 VS2012,而 VS2012 对 C++11 的支持并不完整,导致在 Creo 二次开发过程中暂时无法使用该方法。
参考:C++可变参数的两种方法