ANSI C Comments
Walter Bright
bright at dataio.UUCP
Sat Dec 15 09:19:06 AEST 1984
Some comments on the ANSI C Standards Draft, Nov 12, 1984.
I. PREPROCESSOR
1) What happens for the definition
#define a() texta
#define b textb
and the following appears in the C code:
a()
a
b()
b
Are they substituted as:
texta
syntax error
textb()
textb
Or as:
texta
texta
textb
textb
Basically, is a() interpreted as a macro with no arguments
or as a macro with an argument list that is empty?
2) Along similar lines, how does one specify a blank argument?
Such as:
#define a(b) (b - c)
a() /* expands to ( - c) */
This is explicitly not allowed in the standard, although
it would not cause any problems to allow it.
3) What is the behavior of:
#define a text /* new-line
*/ text2 new-line
Is it equivalent to:
#define a text text2 new-line
4) How about a #exit directive and a #message directive?
#exit constant-expression new-line
would cause the compiler to halt compilation with an
exit status given by constant-expression.
#message string new-line
would print the message during the compilation.
For example:
#ifndef feature
#message "feature is not implemented"
#exit 1
#endif
II. HELP FOR OPTIMIZERS
Optimizing compilers can be helped considerably by the
following restrictions placed on the language:
1) No two distinct external identifiers can refer to the
same storage location. Note that it is only possible
to get this to happen if you link in assembly language
routines.
2) If the address of a particular automatic was never taken,
it is assumed to never be referenced or modified by
an indirect assignment or reference.
int *p;
f()
{ int a;
g(*p); /* could not possibly refer to a */
*p = 5; /* could not possibly point to a */
}
3) Rule 2 also implies that a compiler could put an automatic
in a register if nobody ever took its address. Some compilers
(VAX VMS C and Greenhills C) do this.
4) Some sort of construct telling the compiler that it can
pass this argument to a function in a register. Currently,
since the compiler knows nothing about the called function,
all parameters must be placed on the stack (since the callee
could try to take the address of a parameter).
Passing args on the stack instead of in registers is a major
source of inefficiency in compiled code.
This rule would also imply that variable argument lists
cannot 'cross' a registered argument. For example:
f(a,b,c) where b is passed in a register
one cannot access c by taking a pointer to a and incrementing it.
A possible syntax is an extension to the current method for
specifying the number and types of parameters:
extern int f(int,register int,int);
...
f(a,register b,c)
int a,b,c;
{
...
}
This is NOT the same as the current
f(a,b,c)
int a,c;
register int b;
{}
as b must still be passed on the stack, then copied into
a register.
Walter Bright, Senior Software Engineer
Data I/O, 10525 Willows Road NE, P.O. Box 97046, Redmond, WA 98073-9746
... uw-beaver!teltone!dataio!bright
More information about the Comp.lang.c
mailing list