prev up next   top/contents search

comp.lang.c FAQ list · Question 10.27

Q: How can I include expansions of the __FILE__ and __LINE__ macros in a general-purpose debugging macro?

A: This question tends to reduce to question 10.26. One solution involves writing your debug macro in terms of a varargs function (see questions 15.4 and 15.5), and an auxiliary function which stashes the values of __FILE__ and __LINE__ away in static variables, as in:

#include <stdio.h>
#include <stdarg.h>

void debug(const char *, ...);
void dbginfo(int, const char *);
#define DEBUG dbginfo(__LINE__, __FILE__), debug

static const char *dbgfile;
static int dbgline;

void dbginfo(int line, const char *file)
	dbgfile = file;
	dbgline = line;

void debug(const char *fmt, ...)
	va_list argp;
	fprintf(stderr, "DEBUG: \"%s\", line %d: ", dbgfile, dbgline);
	va_start(argp, fmt);
	vfprintf(stderr, fmt, argp);
	fprintf(stderr, "\n");
With this machinery in place, a call to
	DEBUG("i is %d", i);
expands to
	dbginfo(__LINE__, __FILE__), debug("i is %d", i);
and prints something like
	DEBUG: "x.c", line 10: i is 42

A cunning improvement is the idea of having the stashing function return a pointer to the bona-fide varargs function:

void debug(const char *, ...);
void (*dbginfo(int, const char *))(const char *, ...);
#define DEBUG (*dbginfo(__LINE__, __FILE__))

void (*dbginfo(int line, const char *file))(const char *, ...)
	dbgfile = file;
	dbgline = line;
	return debug;
With these definitions,
	DEBUG("i is %d", i);
gets expanded to
	(*dbginfo(__LINE__, __FILE__))("i is %d", i);

Another, perhaps easier way might simply be to

	#define DEBUG printf("DEBUG: \"%s\", line %d: ", \
	DEBUG("i is %d", i);
simply expands to
	printf("DEBUG: \"%s\", line %d: ",
		__FILE__,__LINE__),printf("i is %d", i);

Finally, you may be able to use the

	#define _ ,
trick from question 10.26.

Additional links: another idea

prev up next   contents search
about this FAQ list   about eskimo   search   feedback   copyright

Hosted by Eskimo North