/* va_list,va_start,va_arg,va_end are all declared in stdarg.h, and declare how to do so,also I can declare them by myself */ #include <stdio.h> //#include <stdarg.h> #define va_list void* #define va_start(arg, start) arg=(va_list)(((char*)&(start))+sizeof(start))/*the first varible's address plus how its data type large is by using sizeof() function*/ #define va_arg(arg, type) *(type*)arg;arg=(char*)arg+sizeof(type) #define va_end(arg) /*this function must give me more than one varible*/ int add(int n, ...) { int i = 0; int result = 0; va_list arg = NULL; //first,I don't know what's type of arg is,so I define it "void*" va_start(arg, n); //point to the first varible,in this func,it is "n" for(i = 0; i < n; i++) { result += va_arg(arg,int);//point to the next varible } va_end(arg); //free the resources return result; } int main(int argc, char* argv[]) { printf("%d/n",add(1,100)); printf("%d/n",add(2,100,200)); printf("%d/n",add(3,100,200,300)); printf("%d/n",add(4,100,200,300)); return 0; } /* how to get the number of varible: 1.give it to function like above 2.give a (-1 or NULL) stand for the last varible 3.use formated string like printf() */