Why are typedef names in the same name space as variable names?
bs at alice.UUCP
bs at alice.UUCP
Sat Dec 6 03:28:22 AEST 1986
In article <7374 at utzoo.UUCP>, henry at utzoo.UUCP writes:
> > ...default sc-specifiers are assigned. K&R state that the default is auto
> > inside a function and *extern* outside. It seems to be *static* in most
> > C implementations these days.
>
> Can you name a few? Extern is the way it has always been in C; compilers
> which default to static are broken. (Please don't cite C++, that isn't C.)
> --
> Henry Spencer @ U of Toronto Zoology
> {allegra,ihnp4,decvax,pyramid}!utzoo!henry
Most (all?) C compilers and lint will accept the following program:
file1:
typedef int I;
I i = 1;
file2:
typedef char* I;
I p = "asdf";
Is it legal? Personally, I think not because the name I which is external by
default has two definitions (but the C++ compiler also accepts it).
The default storage class specifiers are identical in C and C++ so the glib
remark about C++ is irellevant in the context. What is different about C++
in this context is that structure tags are in the same name space as
identifiers (including typedef names). For example, the following is not C++:
struct s { int a; };
struct s s;
As it happens, the generally available C++ implementation accepts this as an
aid to people mixing C and C++.
On a more general note what does it take for a C-like language/implementation
to be ``not C''?
For example, is the C-like language used on many UNIX systems ``not C'' for
failing accept this (perfectly legal) C program?:
typedef double T;
f() {
typedef int T;
}
(C++ accepts it, but on many systems its ``code generator'', cc, chokes on its
perfectly legal intermediate C).
C++ is C by the simple test of its compiler accepting a larger subset of what
is accepted to be C than most C compilers.
Is a ``C-like language'' with a keyword like ``near'' ``not C''? The compiler
for such a C-like language does not accept the perfectly legal C program:
main() { int near = 2; printf("%n\n",near); }
Is a ``C-like language'' without the keyword ``enum'' C?
Clearly, any C with an extension that renders even a single legal C program
uncompilable is in a real sense ``not C''. One purpose of the ANSI C effort
is to define a minimum standard for what should be called C, but is the
minimum all that matters? If so, ought the ANSI C commitee abandon the
different standards found in the proposal (I think their names are:
``conforming'', ``strictly conforming'', `hosted'', and ``embedded''
implementations - each in a real sense defines a different language)?
I don't think so (this would imply 7 character names and several other horrors
- including having to change just about every large C program written to date
because of use of features not in ``strictly conforming ANSI C''). I don't
think that any member of the ANSI C comitte wants to have ONLY a minimal
standard and thereby stop further evolution of C. Hence the practical, but
rather ad hoc, acceptance of unspecified extensions in (mearly) conforming
implementations of C.
C++ is not strictly conforming ANSI C (as proposed), but it is C. The problem
is that it is also much more. In particular, being able to write things like
class complex {
double re, im;
public:
complex(double r, double i)
{ re=r; im=i; }
friend complex operator+(complex a, complex b)
{ return complex(a.re+b.re, a.im+b.im); }
};
f()
{
complex a = complex(1,2);
complex b = a+complex(3,4);
}
precludes writing things like
main() { int class = 2; printf("%n\n",class); }
and
struct complex { double re, im; };
struct complex complex;
complex.re = 2;
More information about the Comp.lang.c
mailing list