Path: utzoo!utgpu!news-server.csri.toronto.edu!mailrus!uwm.edu!cs.utexas.edu!uunet!ittc!fpb From: fpb@ittc.wec.com (Frank P. Bresz) Newsgroups: comp.lang.c Subject: Re: Preprocessor macro to quote its argument Message-ID: Date: 18 Aug 90 20:35:34 GMT References: <1112@mti.mti.com> Sender: news@ittc.wec.com Reply-To: fbresz@ittc.wec.com Organization: Westinghouse, ITTC, Pgh, PA. Lines: 94 In-reply-to: adrian@mti.mti.com's message of 18 Aug 90 02:20:58 GMT In article <1112@mti.mti.com> adrian@mti.mti.com (Adrian McCarthy) writes: >Ever needed a preprocessor macro that could quote its argument? I did for >my own version of assert(). The obvious first try is: > #define Q1(x) " x " >but the argument isn't expanded because it's in quotes. Solution follows... > > #define Q " > #define Q1(x) Q x " >It introduces a few spaces, but fortunately that doesn't conflict with my >needs. >Note that: > #define Q1(x) Q x Q >does *not* work. The second Q won't be translated. >I think my solution is portable. It seems to comply with the ANSI >preprocessing notes in K&R/2. In addition, it works on the non-ANSI >Sun and VAX/VMS compilers. >In case the motivation isn't clear, I wanted something along the lines of: > ASSERT((x > 0)) >to produce: > assert((x > 0), " (x > 0) ") >so that the assert() function could print the assertion if the condition >fails. Funny I have been using the following debug.h for years without much problem. I use the argument a inside quotes and it expands exactly as I want it to. You have to be carefull about side effects because it evaluates twice. Once for the printing and once to get the result this allows a = dbgdec(x); to work correctly. I use the dbgmsg[n] to print out informational messages to stderr. I name everything dbg so I can quickly nuke them when I am done debugging. BTW This is on SunOS I have also done it on an INTEL 310 system running some XENIXy kind of unix. debug.h #define dbgflt(a) (fprintf(stderr,"a = %f\n",a),fflush(stderr),(a)) #define dbghex(a) (fprintf(stderr,"a = %08lx\n",a),fflush(stderr),(a)) #define dbghexs(a) (fprintf(stderr,"a = %04x\n",a),fflush(stderr),(a)) #define dbghexc(a) (fprintf(stderr,"a = %02x\n",(unsigned char) a),fflush(stderr),(a)) #define dbgdec(a) (fprintf(stderr,"a = %12ld\n",a),fflush(stderr),(a)) #define dbgdecs(a) (fprintf(stderr,"a = %6d\n",a),fflush(stderr),(a)) #define dbgdecc(a) (fprintf(stderr,"a = %3d\n",(unsigned char) a),fflush(stderr),(a)) #define dbgmsg(a) (fprintf(stderr,"%s\n",a),fflush(stderr),(a)) #define dbgmsgn(a) (fprintf(stderr,"%s",a),fflush(stderr),(a)) #define dbgsev(a) (fprintf(stderr,"a = '%s'\n",a),fflush(stderr),(a)) #define dbgfile (fprintf(stderr,"%s:%d",__FILE__,__LINE__),fflush(stderr)) It allows me to put the following in my C code and I will get results below: ... int foo; char *str; dbgdec(foo); .... dbghex(str); dbgsev(str); .... Execution is ... foo = 15 ... str = 0x00049812 str = 'This is a test' -- +--------------------+ |fbresz@ittc.wec.com | My opinions are my own, I'm not paid |uunet!ittc!fbresz | enough to make an official statement |(412)733-6749 | +-----------------------------------+ |Fax: (412)733-6444 | | THIS SPACE FOR SALE!!! | +--------------------+ +-----------------------------------+