Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!watmath!clyde!floyd!cmcl2!seismo!hao!hplabs!sri-unix!trainoff.pasa@XEROX.ARPA From: trainoff.pasa@XEROX.ARPA Newsgroups: net.lang.c Subject: Re: close-order manual reading Message-ID: <979@sri-arpa.UUCP> Date: Mon, 18-Jun-84 12:48:00 EDT Article-I.D.: sri-arpa.979 Posted: Mon Jun 18 12:48:00 1984 Date-Received: Thu, 21-Jun-84 00:46:24 EDT Lines: 56 > Just another note on the C preprocessor and on exegesis from K&R: I had a > program for which I thought I'd write a common macro to report errors, and > > > wrote > > #define error(s) fprintf(stderr, "prog: line %d--%s\n", (s)) > > to do the job, I thought. Feeling mildly smug, I compiled the program that > contained this #define, and came back with errors. Checking the resuls from > the preprocessor showed that the preprocessor was replacing the s in %s > with the actual parameter when I used the error macro. > > Gee, I thought; doesn't the sentence under section 12.1, "Token Replacement," > on page 207 of K&R, > > Text inside a string or a character constant is not subject > to replacement. > > imply that that shouldn't happen? I thought it did, but experimentation on > a machine running 4.2 BSD (I was using a microcomputer C compiler the first > time around) gave the same results. > > The fix to this particular problem is, of course, straightforward, and I > have done it and gone on my way, but I present it here as an example. > To paraphrase Raymond Smullyan, doesn't this make you think that there's > something just a little bit wrong with English specification of semantics? > > James Jones I too have run into this, however in a different context. When I first was learning C there was a macro in one of the libraries called DEBUG which exploited this. If memory serves me, it was defined as: #define DEBUG(var, type) printf("var = %type\n", (var)); It was quite convenient for dumping intermediates. It just saved a bit of typing and stood out in the code. When the program was considered completed, I would just globally comment them out or delete them. Recently, I tried to recreate this macro on Whitesmith's C compiler only to find out that it does work. Your example compiles just as originally intended. I'm not sure which I prefer. Whitesmith's treatment produces fewer surprises but is less flexible. One thing I am certain I would prefer is uniformity. Steve Trainoff Xerox Special Information Systems Pasadena, CA.