ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux C 可变参数类型va_list

2022-04-02 21:00:19  阅读:218  来源: 互联网

标签:va int list 列表 ap 参数 linux


目录

可变函数参数,会用到va_list系列宏,在C中用于定义可变参数列表,包含可变参数信息。

常用的va_list系列宏

包含:

  • va_start(ap, last)宏:初始化可变参数列表;
  • va_arg(ap, type)宏:返回下一个参数;
  • va_copy(dest, src)宏:复制参数列表指针,将dest初始化为src;
  • va_end(ap)宏:结束使用可变参数列表,会清空参数列表,置参数ap无效;

其声明如下:

#include <stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);

例如,我们常用的C库函数printf,就用到了可变参数列表

#include <stdio.h>
int printf(const char *format, ...);

形参列表里的 "..."代表0个或多个参数。

将可变参数由“...”转换为va_list类型形式,

#include <stdarg.h>

int vprintf(const char *format, va_list ap);

va_list系列宏使用模式

对于自定义可变参数列表的函数,可用va_list系列宏,按如下模式对可变参数进行解析:

void func(type v, ...) 
{
    va_list(ap, v); // 定义一个指向个数可变的参数列表指针
    va_start(ap, v); // 使指针ap指向函数参数列表的第一个可选参数,v是第一个可选参数之前的固定参数
    
    while () {
        type tmp = va_arg(ap, type); // 返回参数列表中指针ap所指的参数,返回类型为type,并使指针ap指向下一个参数
    }

    va_end(ap); // 清空参数列表,并置参数列表指针ap无效
}

例1:定义一个可变参数的求和函数

int sum(int v, ...)
{
    int i = v;
    int s = 0;

    va_list ap;
    va_start(ap, v);

    while (i > 0) {
        s += va_arg(ap, int);
        i--;
    }

    //  {
    volatile int tmp = va_arg(ap, int); // tmp是未知值
    printf("tmp = %d\n", tmp);
    // } 用于测试

    va_end(ap);

    return s;
}

调用:

int main()
{
    int s = sum(3,2,3,4);
    printf("sum = %d\n", s);
    return 0;
}

运行结果:

tmp = -1392657952
sum = 9

例2:定义一个自定义打印字符串函数

void my_print(const char *fmt, ...)
{
    char *s = fmt;
    va_list ap;

    va_start(ap, fmt);

    while (s != NULL) {
        printf("%s\n", s);
        s = va_arg(ap, char *);
    }

    va_end(ap);
}

调用:

int main()
{
    my_print("hello", "yes", "no");
    return 0;
}

运行结果:

hello
yes
no

标签:va,int,list,列表,ap,参数,linux
来源: https://www.cnblogs.com/fortunely/p/16093933.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有