--- muppet wrote: > writing your own printf-style macros is actually a very common idiom > for getting around this sort of technical problem. they, of course, > raise the further problem that GCC's vararg macros are not portable, > and C99's vararg macros are not yet universally supported.
Agreed. I missed that __VA_ARGS__ earlier; that won't work on many current C compilers. In an attempt to do varargs ok() without the magical __VA_ARGS__, I've come up with two little example solutions shown below. Improvements welcome. /* Sound version but with ugly XX symbol ----------------- */ #include <stdio.h> #include <stdarg.h> #define XX __FILE__,__LINE__ void ok(int cond, const char* file, unsigned long line, const char* fmt, ...) { va_list t; printf("cond:%d file:%s line:%lu, ", cond, file, line); va_start(t, fmt); vprintf(fmt, t); va_end(t); } int main() { ok(1==1, XX, "test %s %d\n", "one eq one", 42); ok(0==1, XX, "test %s %d\n", "zero eq one", 43); return 0; } /* Horrible hacky thread-unsafe version but no XX -------- */ #include <stdio.h> #include <stdarg.h> #define ok ok_save(__FILE__, __LINE__) typedef void (*ok_t)(int, const char*, ...); static const char* g_file; static unsigned long g_line; void gr(int cond, const char* fmt, ...) { va_list t; printf("cond:%d file:%s line:%lu, ", cond, g_file, g_line); va_start(t, fmt); vprintf(fmt, t); va_end(t); } ok_t ok_save(const char* file, unsigned long line) { g_file = file; g_line = line; return gr; } int main() { ok(1==1, "test %s %d\n", "one eq one", 42); ok(0==1, "test %s %d\n", "zero eq one", 43); return 0; } /* ------------------------------------------------------- */ /-\ Find local movie times and trailers on Yahoo! Movies. http://au.movies.yahoo.com