[原]变参函数原理详解

/*
变参函数原理说明:
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;
}

posted @ 2011-08-05 14:38  hnrainll  阅读(350)  评论(0编辑  收藏  举报