limitations of casts, pointer and function declarartions...

Thomas M. Breuel breuel at harvard.ARPA
Sun Oct 28 18:56:08 AEST 1984


The following questions came up while I was implementing the kernel of
a PROLOG pseudo-code interpreter in 'C'. I think that these three
constructs, casting the lhs of an assignment, pointers to themselves,
and functions with return value of a pointer to their own type, are
very useful (say convenient), in particular for the implementation of
symbol manipulation languages, and I hope that there are some nice cpp
& ccom tricks around to make them more convenient, and I hope that
they will eventually be permitted by the compiler.
==============================================================================
The (4.1/4.2BSD) C-compiler does not accept statements of the
following form:

{
	int x;
	char *y;
/*### [cc] illegal lhs of assignment operator = %%%*/
	(char *)x = y;
}

I don't think that this error message is sensible, since statments like

*((long *) 100) = 100;

work.

Bug, feature; explanation, or excuse? (the solution here is, of
course, to write 'x = (int)y;', but can the compiler make this
transformation without ambiguity in general?).
==============================================================================
I would like to declare a pointer to a thing of its own kind, i.e.
something of the form:

typedef ref *ref;

The point is that if a pointer of this type is dereferenced, it should
have the same type again.  In addition, the type should be cast'able
to/from integer, and the size associated with it should be that of a
single pointer of its kind.  I.e. expressions of the following type
should be possible:

{
	ref a,b;
	long c;
	*a = b;
	a = *b;
	c = (int)a;
	a = (ref)c;
	a++;
}

My first attempt was:

typedef long base;	/* change this to int type with size of pointer */
typedef base *ref;
#define deref(thing) ((ref)(*thing))

This works fine if one does all dereferencing through 'deref',
except that assignments still don't work quite right, since
'deref(thing)=thing;' still does not work, and the rhs has to
be cast instead (i.e. '*thing = (base)thing').
==============================================================================
Along the same lines, I'd like to be able to define a function
returning a pointer to its own kind, i.e.

typedef fun (*fun)();

which is useful to implement continuations without having to resort
to machine language hacks.
==============================================================================

					Thomas M. Breuel
				      breuel at harvard.arpa
			     ...{genrad!wjh12,seismo}!harvard!breuel



More information about the Comp.lang.c mailing list