/*
變參函數原理說明:
va_start就是求得第一個可變參的地址.
下面幾個宏的作用:保是來確定可變參數的列表中每個參數的地址.
實現變參函數的要點,就是想辦法取得每個參數的地址.
*/
#include <stdio.h>
#include <stdarg.h>
#if 0
#define va_list void*
#define va_arg(arg, type) *(type*)arg; arg = (char*)arg + sizeof(type);
#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))
#endif
int sum(int nr, ...)
{
int i = 0;
int result = 0;
va_list arg = NULL;//定義一個變量
//va_start的作用卻實是將第一個變量的址址給arg.
va_start(arg, nr); //將第一個變量的地址給arg
for(i = 0; i < nr; i++)
{
result += va_arg(arg, int);
}
return result;
}
int main(int argc, char* argv[])
{
printf("%d\n", sum(4, 100,100,100,100));
printf("%d\n", sum(3, 200, 200, 200));
return 0;
}
___________________________________________
第二次程序:
#include <stdio.h>
void fun1(char *fmt,...)
{
char **lst;
printf( "fun1\n" );
lst = (char *)&fmt+sizeof(char *);
printf(" the parameter is [%s]\n",*lst);
}
void fun2(int a,...)
{
char *lst;
printf( "fun2\n" );
lst = (char *)&a+sizeof(int);
printf(" the parameter is [%d]\n",*lst);
}
int main(void)
{
fun1("hello","world");
fun2(1, 2, 3, 4);
return 0;
}