zoukankan      html  css  js  c++  java
  • C语言变参函数的实现原理

    1. 变参函数简单示例

    #include <stdarg.h>
    #include <stdio.h>
    
    int Accumlate(int nr, ...)
    {
        int i = 0;
        int result = 0;
        va_list arg = NULL;
        va_start(arg, nr);
        
        for(i = 0; i < nr; i++)
        {
            result += va_arg(arg, int);
        }
        
        va_end(arg);
        
        return result;
    }
    
    int main()
    {
        printf("%d
    ", Accumlate(1, 100));
        printf("%d
    ", Accumlate(2, 100, 200));
        printf("%d
    ", Accumlate(3, 100, 200, 300));
        
        return 0;
    }

    2. 变参函数的实现原理

    #define va_list void*

    #define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))

    #define va_arg(arg, type) *((type*)arg); arg = (char*)arg + sizeof(type);

    #define va_end(arg) arg = 0;

    #include <stdio.h>
    
    #define va_list void*
    
    #define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))
    
    #define va_arg(arg, type) *((type*)arg); arg = (char*)arg + sizeof(type);
    
    #define va_end(arg) arg = NULL;
    
    
    int Accumlate(int nr, ...)
    {
        int i = 0;
        int result = 0;
        va_list arg = NULL;
        va_start(arg, nr);
        
        for(i = 0; i < nr; i++)
        {
            result += va_arg(arg, int);
        }
        
        va_end(arg);
        
        return result;
    }
    
    int main()
    {
        printf("%d
    ", Accumlate(1, 100));
        printf("%d
    ", Accumlate(2, 100, 200));
        printf("%d
    ", Accumlate(3, 100, 200, 300));
        
        return 0;
    }

    3. 关于参数结束标志的问题

    ① 指定参数个数,如示例代码

    ② 用固定值(如-1或NULL)表示最后一个参数

    ③ 用格式化字符串,如printf函数

    注:变参函数至少要提供一个参数

  • 相关阅读:
    ASP创建对象及中文显示解决方法
    webservice解读
    top监控工具
    Crontab实例
    javascript闭包的理解
    98万买下51.com域名,51.com不止2000万美金
    百度08年网页搜索份额73.2% 创历史新高
    讲故事投资 天使投资人的中国式生存
    下个谷歌将诞生于中国或印度
    Twitter入选10大搜索引擎
  • 原文地址:https://www.cnblogs.com/wulei0630/p/9444062.html
Copyright © 2011-2022 走看看