c動態引數實現
阿新 • • 發佈:2020-11-29
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; }
動態引數實現過程:
- 通過固定引數獲取被調函式棧中推入的非固定引數個數與型別
- 依照規則依次讀取棧中非固定引數
- 基本運算
- 清除讀取所用引數指標
- 返回結果