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\n", Accumlate(1, 100)); printf("%d\n", Accumlate(2, 100, 200)); printf("%d\n", Accumlate(3, 100, 200, 300)); return 0; }
2. 變參函數的實現原理spa
#define va_list void*code
#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))blog
#define va_arg(arg, type) *((type*)arg); arg = (char*)arg + sizeof(type);字符串
#define va_end(arg) arg = 0;io
#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\n", Accumlate(1, 100)); printf("%d\n", Accumlate(2, 100, 200)); printf("%d\n", Accumlate(3, 100, 200, 300)); return 0; }
3. 關於參數結束標誌的問題class
① 指定參數個數,如示例代碼原理
② 用固定值(如-1或NULL)表示最後一個參數di
③ 用格式化字符串,如printf函數co
注:變參函數至少要提供一個參數