加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 以递归方式解析va_list中的args是否可以?

发布时间:2020-12-16 06:59:35 所属栏目:百科 来源:网络整理
导读:假设我想通过让函数的每次调用读取下一个参数来创建一个递归解析可变参数列表的函数?在将va_list交给下一个函数之后,我不打算继续在调用函数中使用va_list.以下代码是否正常: void VarArgRecursive( va_list args ) { int nextArg = va_arg(args,int); if(
假设我想通过让函数的每次调用读取下一个参数来创建一个递归解析可变参数列表的函数?在将va_list交给下一个函数之后,我不打算继续在调用函数中使用va_list.以下代码是否正常:

void VarArgRecursive( va_list args ) {
    int nextArg = va_arg(args,int);
    if( nextArg != -1 ) {
        printf("Next arg %dn",nextArg);
        VarArgRecursive(args);
    }
}

void VarArgFunc( int firstArg,... ) {
    va_list args;
    va_start(args,firstArg);
    VarArgRecursive(args);
    va_end(args);
}

int main (int argc,char * const argv[]) {

    VarArgFunc(20,12,13,-1);

    return 0;
}

代码在我的系统上编译,输出符合预期:

Next arg 12
Next arg 13

那么,这种做法可以吗?我搜索了列表,发现在将va_list交给下一个函数后,调用函数中的va_list的内容是未定义的.这对我的用法无关紧要,因为在将其交给下一个(实际上,相同的)函数之后我不会继续使用va_list.我也检查了这个页面:

http://c-faq.com/varargs/handoff.html

…这表明我将va_list移交给下一个函数的方式是可以的.它没有说的是,在读取一个arg之后将va_list交给另一个函数是否可以,并期望被调用的函数读取下一个arg.如果这个问题有c特定的答案,那也没关系,因为它将在c程序中使用.

解决方法

你可以多次传递它,但你不能多次“使用”va_list.在使用时,可以修改va_list并再次使用它是根据C规范的未定义行为.

如果要多次使用它,请在使用之前调用va_copy克隆va_list,然后传递副本.

但是,在您的情况下,您所做的事情是可以接受的.当您尝试将va_list从开头传递到另一个函数时,会出现问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读