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函数

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

  • 相关阅读:
    9.5---所有字符串的排列组合(CC150)
    9.4---集合子集(CC150)
    9.3---魔术索引(CC150)
    5.3(2)----机器人走方格2(CC150)
    9.2---机器人走方格(CC150)
    9.1---上楼梯(CC150)
    5.3---找最近的两个数(CC150)
    5.8---像素设定(CC150)
    7.4---加法替代运算(CC150)
    4.9---二叉树路径和(CC150)
  • 原文地址:https://www.cnblogs.com/wulei0630/p/9444062.html
Copyright © 2011-2022 走看看