__STDC__
Steve Summit
scs at adam.pika.mit.edu
Mon Jul 3 01:50:12 AEST 1989
I don't want to open the whole __STDC__ can of worms again, but I
have two questions:
1. Is there anything to the argument that nobody should be
setting __STDC__ to 1 yet, since the standard isn't approved,
and that everyone should, at this point, be setting it to 0 to
indicate as much conformance to the draft as they can manage
(and not "we have prototypes and the useful stuff but not hair
like trigraphs" or similar half-compliance schemes which have
been so thoroughly denounced)? (This may be a frivolous
question; don't flame if you find it so.)
2. Why is it forbidden to re#define __STDC__? In a previous
article, I discussed needless restrictions, and this seems to
me to be one. Why shouldn't a program re#define __STDC__, if
it really wants to and is prepared to accept the consequences?
Why would a program want to, you ask? In an open system, the
burden of proof is on the implementor to show why a
restriction is necessary, not on the user to provide a useful
counterexample.
Even so, I can provide a realistic example of why mucking with
__STDC__ would be useful: suppose I am interested in keeping my
code compatible with earlier, non-ANSI compilers (a far from
hypothetical suggestion). If my primary development machine uses
an ANSI compiler, I might from time to time want to check if the
changes and additions I have been making are (at least
syntactically) still usable on the non-ANSI machine, without
necessarily taking all of the code over to the old machine and
compiling it. It seems natural to say
cc -U__STDC__
yet this is forbidden. It is claimed to make the compiler
writer's life easier, having perhaps something to do with vendor-
supplied header files, but even if the header files have #ifdefs
on __STDC__ in them (perhaps to make them usable with a non-ANSI-
compliant invocation mode) the old give-him-enough-rope-to-hang-
himself philosophy says that I ought to just get obscure errors
(if in fact there are obscure conflicts). (No :-), I'm serious.)
Instead, the compiler writer, as I understand it, is obliged to
have code like
cppdefine(name, value)
char *name, *value;
if(strcmp(name, "__STDC__") == 0 || strcmp(name, "__LINE__") == 0 ...)
{
error("illegal re#definition of %s", name);
return ERROR;
}
in the preprocessor. I can maybe understand the prohibition on
re#defining __LINE__, since it may well be implemented strangely
(its value changes practically every time you expand it) and
re#defining it therefore ineffectual, but prohibiting changing
__STDC__ just keeps me from doing what I want to do without
affecting the compiler at all (other than adding an extra test).
I don't believe that it is the compiler (or preprocessor)
writer's job to protect the header file author from me; if I muck
with __STDC__ and it breaks a standard header file, that's my
problem, not the compiler's.
Steve Summit
scs at adam.pika.mit.edu
More information about the Comp.lang.c
mailing list