/* * A demonstration of counting the number of arguments passed to * a variadic function, by inspecting the stringified argument list. * See: * http://vgable.com/blog/2009/10/16/hack-counting-varadic-arguments-in-c/ * * To build and run: * $ gcc iArray.c -o iArrayTest && ./iArrayTest */ #include #include #include #define iArray(...) alloc_ints(count_arguments(#__VA_ARGS__), __VA_ARGS__) /* * We ASSUME that s is a non-empty list of values or variables. * Under those (naive) assumptions, the number of arguments * in s is 1 + the number of commas seperating arguments. */ unsigned count_arguments(char *s){ unsigned i,argc = 1; for(i = 0; s[i]; i++) if(s[i] == ',') argc++; return argc; } /* * Return an array filled with count ints */ int *alloc_ints(unsigned count, ...){ unsigned i = 0; int *ints = malloc(sizeof(int) * count); va_list args; va_start(args, count); for(i = 0; i < count; i++) ints[i] = va_arg(args,int); va_end(args); return ints; } void print_iArray(char *msg, unsigned count, int *ints){ unsigned i = 0; printf("%s = [", msg); for(i = 0; i < count; i++){ if(i) printf(", "); printf("%d", ints[i]); } printf("]\n"); } int main(int argc, char** argv){ int one = 1; int three = 3; int *iArr = iArray(1,2,3); print_iArray("iArray(1,2,3)",3,iArr); free(iArr); iArr = iArray(one,2,three); print_iArray("iArray(one,2,three)",3,iArr); free(iArr); iArr = iArray(-one,2,-three,4,-5,6,-7,8,-9,10); print_iArray("iArray(-one,2,-three,4,-5,6,-7,8,-9,10)",10,iArr); free(iArr); }