Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!lll-crg!lll-lcc!well!few From: few@well.UUCP (Frank Whaley) Newsgroups: net.lang.c Subject: Re: Disappearing function call Message-ID: <1876@well.UUCP> Date: Thu, 2-Oct-86 13:21:46 EDT Article-I.D.: well.1876 Posted: Thu Oct 2 13:21:46 1986 Date-Received: Sat, 4-Oct-86 06:40:18 EDT References: <357@cullvax.UUCP> Reply-To: few@well.UUCP (Frank Whaley) Organization: Whole Earth Lectronic Link, Sausalito CA Lines: 48 In article <357@cullvax.UUCP> drw@cullvax.UUCP (Dale Worley) writes: >What I want to do is to write a function call of a variable number of >arguments: > debug(x, y, z, ...) >that will generate no code when the symbol DEBUG is not defined, but >generate a call of some function (say, debug_()) when it is. Numerous ugly examples deleted. I had to do this just recently, and took advantage of the fact that my compilers "optimize out" code like this: if (0) function(); So assuming: #ifdef DEBUG #define _DEBUG 1 extern void _debug(char *,) /* debugging printf() */ #else #define _DEBUG 0 #endif #define debug if(_DEBUG)_debug a statment like: debug("%d:%d:%d\n", a, b, c); becomes either: if(1)_debug("%d:%d:%d\n", a, b, c); or if(0)_debug("%d:%d:%d\n", a, b, c); /* no code generated */ All of my compilers generate the strings anyway, so I used a set of external strings (bracketed by #ifdef's) for all debugging messages. Some compilers require an optimizer pass to eat the dead code. -- Frank Whaley Senior Engineer, Beyond Words UUCP: hplabs! ihnp4!ptsfa! seismo!lll-crg!well!few ARPA: well!few@lll-crg.ARPA Water separates the people of the world; wine unites them.