safe variadic functions
#define sizeof_array(arr) ((sizeof (arr))/(sizeof (arr)[0])) /* * NOTE: imagine that following macro definition is properly backslashified. * And blame Google/Blogger for my not being able to do this. */ #define FOO(a, ...) foo((a), (char *[]){ __VA_ARGS__, 0 }, sizeof_array(((char *[]){ __VA_ARGS__ }))) int foo(int x, char **str, int n) { printf("%i %i\n", x, n); while (n--) printf("%s\n", *(str++)); printf("last: %s\n", *str); } int main(int argc, char **argv) { FOO(1, "a", "boo", "cooo", "dd", argv[0]); }
1 5 a boo cooo dd ./a.out last: (null)Expect me to use this shortly somewhere.
What was it in C99 that made this possible?
ReplyDeleteWhat was it in C99 that made this possible?
ReplyDeleteIntroduction of __VA_ARGS__ and compound literals (in C9X standard draft, to become later C99 standard).
Of course, some compilers supported these features before.