[comp.lang.c] ctl

msb@sq.uucp (Mark Brader) (02/21/88)

> #define ctl(c) ('c'&037)

This is a well-known nonportability.  Substitution within string and
character constants was a feature of certain versions of the C compiler
(including many UNIX versions) that was documented only in the README
file in the source directory for the compiler!  If it had been generally
announced, e.g. in K&R, it might have made it into the ANSI standard,
but as it never was announced, it is best considered a common *bug*.
There are arguments in favor of it and against it.

The stringizing operator was the ANSI subcommittee's invention, a different
way to get that functionality, but it is also nonportable to most existing
systems.

> I have come up with some ugly fixes, but would like to know: what is
> the Right Way to do this?

Don't turn what looks like a variable (namely c) into a constant.  Say

	#define CTL(c) ((c) & 037)

and use
	CTL('c')

Okay?
Mark Brader, SoftQuad Inc., Toronto, utzoo!sq!msb, msb@sq.com
#define	MSB(type)	(~(((unsigned type)-1)>>1))