可变参数的函数

本文探讨了C语言中使用可变参数宏的原理和步骤,包括va_list、va_start、va_arg和va_end的使用。同时,提到了这种方法的安全隐患,如参数个数不匹配可能导致严重错误。另外,文章提及了C++11的initializer_list作为更安全的替代方案,但由于VS2012对C++11支持的不完全,导致在Creo二次开发中无法使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可变参数的宏

  1. 函数声明
    int CheckEnv(int count, ...);
    函数声明与普通函数声明方式类似,只是参数列表中第一个参数 count 标识参数数量,…为实际参数列表
  2. 参数读取
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++可变参数的两种方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值