Forming composite tokens (3 ways)

rcd at opus.UUCP rcd at opus.UUCP
Wed May 9 11:16:06 AEST 1984


It has already been noted (see ref) that you can concatenate tokens with
the preprocessor (at least in 4.x BSD; I don't know whether this is
epidemic) with:

#define	CAT(x,y)	x/**/y

with the preprocessor discarding comments.  As noted earlier, this is not
only grungy, it gives lint a lot of grief.
---
A second solution is to use the interpretation of \ at end of line:

#define CAT(x,y)	x\
y

which seems a little cleaner, but I'm still dubious; it seems like a dark
corner.  I think it's safe to conclude that the preprocessor can't rejoin
lines when the first ends with \, but that the lex. analyzer must do so...
Still, I don't like it very much.
---
Yet a third, and in some sense the one that seems least grungy (but it's
the fault of nbires!vjs if you don't like it:-) is:

#define	I(x)	x
#define	CAT(x,y)	I(x)y

I is just an "identity macro" which gives you a chance to get something
between the x and y (a parenthesis) in the definition of CAT.
---
Anyone care to comment on esthetics?  I'd also like to hear of compilers
for which the latter two don't work.
-- 
...Nothing left to do but smile, smile, smile.		Dick Dunn
{hao,ucbvax,allegra}!nbires!rcd				(303) 444-5710 x3086



More information about the Comp.lang.c mailing list