Macro sustitution inside quotes
Sean Fagan
seanf at sco.COM
Wed Apr 11 19:11:02 AEST 1990
In article <1284 at necisa.ho.necisa.oz> boyd at necisa.ho.necisa.oz (Boyd Roberts) writes:
>String concatenation and the # operator just isn't keeping with the
>style of the language. The # operators are particularily revolting:
>
> #define string(s) # s
>
>It is not obvious or intuitive what kind of expansion occurs.
I have to agree with you there. I get confused about # and ## all the time,
which, considering what I do for a living, means it's not going to be fun
for everyone who is relearning C (I suspect people learning it from scratch
will not have this problem).
>Whereas:
>
> #define string(s) "s"
>
>evaluates in the way you would expect.
Yes. On "my" compiler, it certainly does. It expands as "s", no matter
what is passed into string.
>Apart from that, # operators break things.
Uhm, what does it break, pray tell? I know of no valid construct in C which
allows '#' (except preprocessor directives, and I have never seen anyone use
a p.p. directive *inside* a macro).
>Why weren't the Reiser
>conventions just formalised? Oh no, that would be too easy.
Because some of us think it is really stupid, disgusting, etc. Perhaps you
also want to check for '*/' inside of quotes? Or how about non-paramater
macros? (Checking for parameter expansions *only* was more difficult in my
implementation, albeit not much.)
>There is no basis in the language for string concatenation. It is
>at odds with the lexical and syntactic structure of the language.
Maybe. However, I happen to like it. It is easy to remember, and breaks
nothing.
>Function calls:
>
> f(a, b)
^
>Not:
>
> f(a b)
Uhm, actually, it did. Note that the space is optional in C, both K&R,
Reiser, and ANSI.
>The preprocessor and language weren't broken. But they got `fixed' anyway.
You pointed it out yourself. The "Reiser" conventions. Other people were
*not* doing it that way, and it was not used in K&R. The preprocessor was
lacking, in terms of stringizing (although I really really want a
characterizer 8-)), and concatenating strings is a truly *marvelous*
thing to do. There is one program in AT&T's distribution which has a 7k
long string. All but the first line begins at the first character, and is
really difficult to read. Using string concatenation, it ends up being
*much* easier, and is very difficult to confuse it with the rest of the
program (consider:
char *p = "to declare a variable of type int in C, use \
int a; \
Simple, no?";
versus
char *p = "to declare a variable of type in in C, use "
"int a; "
"Simple, no?";
I prefer the latter. If you don't, maybe you should stick with fortran?)
--
-----------------+
Sean Eric Fagan | "It's a pity the universe doesn't use [a] segmented
seanf at sco.COM | architecture with a protected mode."
uunet!sco!seanf | -- Rich Cook, _Wizard's Bane_
(408) 458-1422 | Any opinions expressed are my own, not my employers'.
More information about the Comp.std.c
mailing list