C语言开发具有可变长参数的函数的方法

前提:ANSI C 为了提高可移植性, 通过头文件stdarg.h提供了一组方便使用可变长参数的宏

我们考虑写一个山寨版的 printf(), 取名为 tiny_printf()
tiny_printf()的第一个参数指定后续的各参数的类型, 第二个参数开始指定需要输出的值
tiny_printf("sdd", "result..", 3, 5);

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

void tiny_printf(char *format, ...)   //原型声明的参数中出现…, 对于这部分的参数是不会做类型检查的
{
    int i;
    va_list ap;    //typedef char *  va_list;

    va_start(ap, format);    //使指针 ap 指向参数 format 的下一个位置,得到了第一个参数
    for (i = 0; format[i] != '\0'; i++) {
        switch (format[i]) {
            case 's':
            printf("%s ", va_arg(ap, char*));   
            break;
            case 'd':
            printf("%d ", va_arg(ap, int));
            break;
            default:
            assert(0);
        }
    }
    va_end(ap);  //标准里指出了对于具有 va_start()的函数需要写 va_end()
    putchar('\n');
}

int main(void)
{
    tiny_printf("sdd", "result..", 3, 5);

    return 0;
}

在这里插入图片描述

posted @ 2019-10-17 21:47  CodeAllen  阅读(357)  评论(0编辑  收藏  举报