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\n", Accumlate(1, 100)); printf("%d\n", Accumlate(2, 100, 200)); printf("%d\n", 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\n", Accumlate(1, 100)); printf("%d\n", Accumlate(2, 100, 200)); printf("%d\n", Accumlate(3, 100, 200, 300)); return 0; }
3. 关于参数结束标志的问题
① 指定参数个数,如示例代码
② 用固定值(如-1或NULL)表示最后一个参数
③ 用格式化字符串,如printf函数
注:变参函数至少要提供一个参数