码迷,mamicode.com
首页 > 其他好文 > 详细

可变参数的函数与宏

时间:2015-04-23 09:37:11      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:c   可变参数   

1、可变参数的函数

<stdarg.h>头文件中定义了一些宏,用于可变参数的函数,如下

va_list:这种类型声明局部状态变量,假设变量名为va(用于下面的描述),用于遍历函数。

va_start:这个宏初始化状态变量va,要先调用之后才能调用va_argva_end

va_arg:这个宏返回参数表中下一个参数的值,将内部指针(在va中)移到下一个参数,下一个参数的类型要用type指定,使va_arg能够计算其在堆栈中的长度,调用va_start之后第一次调用va_arg返回第一个可变参数的值。

va_end:这个函数或宏在用va_arg读取所有参数之后调用,对va进行必要的整理操作。

va_copyC99中新增,这个宏在dest中复制src的当前状态,在参数表中生成第二个指针,然后可以独立对srcdest采用va_argdest中要像src中一样调用va_end

下面是一个简单的了例子:

#include <stdio.h>
#include <stdarg.h>

void printargs(int num, ...)
{
    va_list va;
    va_start(va, num);
    int index = 0;
    int value = num;
    while (1) {
        printf("args[%d] = %d\n", index, value);
        if ((value = va_arg(va, int)) == 0) {
            break;
        }
        index++;
    }
    va_end(va);
}

int main(void)
{
    printargs(1, 2, 3, 4, 5, 0);

    return 0;
}

输出结果如下:

    args[0] = 1
    args[1] = 2
    args[2] = 3
    args[3] = 4
    args[4] = 5

2、可变参数的宏

可变参数的宏,有两种形式,如下例子:

#define MultiArgs(format, ...) printf(format, __VA_ARGS__)
#define PrintArgs(format, args...) printf(format, ##args)

MultiArgs("%s, %s\n", "hello", "world!"); // hello, world!
PrintArgs("%s, %s\n", "hello", "c language!"); // hello, c language!

需要注意的是,上面两种参数宏的参数列表形式的差异,PrintArgs宏的arg参数后面不能有逗号。


可变参数的函数与宏

标签:c   可变参数   

原文地址:http://blog.csdn.net/ieearth/article/details/45216625

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!