1. 程式人生 > 實用技巧 >c動態引數實現

c動態引數實現

c動態引數實現

標準庫stdarg.h

下面出自 vadefs.h

     typedef char* va_list;
     #define _ADDRESSOF(v) (&(v))
     #define _INTSIZEOF(n)          ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1)) //剩餘定理
     #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))
     #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
     #define __crt_va_end(ap)        ((void)(ap = (va_list)0))
    #include <stdarg.h>
    #include <stdio.h>
    int Add(int n, ...)
    {
        va_list arg_ptr; // 引數指標
        int add = 0, number = 0; // 初始化
        va_start(arg_ptr,n); //取固定末尾引數地址
       for (size_t i = 1; i < n+1; i++)
       {
           /* code */
           number = va_arg(arg_ptr,int); //移動引數指標,並返回資料
           add += number;
       }
        va_end(arg_ptr); //清除引數指標
        return add;
    }
    int main()
    {
        printf("%d\n",Add(2,1,3));
        return 0;
    }

動態引數實現過程:

  • 通過固定引數獲取被調函式棧中推入的非固定引數個數與型別
  • 依照規則依次讀取棧中非固定引數
  • 基本運算
  • 清除讀取所用引數指標
  • 返回結果

參考連結 https://www.cnblogs.com/h5l0/p/12022347.html