Path: utzoo!mnetor!tmsoft!torsqnt!news-server.csri.toronto.edu!bonnie.concordia.ca!thunder.mcrcim.mcgill.edu!snorkelwacker.mit.edu!think.com!spool.mu.edu!uunet!olivea!oliveb!amdahl!netcom!avery From: avery@netcom.COM (Avery Colter) Newsgroups: comp.lang.c Subject: Re: Is typedef char BUFFER[20] legal? Message-ID: <23128@netcom.COM> Date: 7 Feb 91 19:05:10 GMT References: <1212@tredysvr.Tredydev.Unisys.COM> <1991Jan29.210100.8105@zoo.toronto.edu> <22642@netcom.UUCP> Organization: Netcom - Online Communication Services UNIX System {408 241-9760 guest} Lines: 64 One of the high masters has given me a sound rapping on my shoulder about typedefs. So I went back to read the books I have, and guess what, they didn't detail the typedeffing of arrays. In fact, all they detailed were typedefs of pointer to simple objects and of structures. So, these two books left me with the mistaken notion that typedef was some kind of macro with two arguments, the second being the name of the derived type and the first being like a typecast. Make not this mistake, fellow students, lest the master give YOU a sound rapping. So, for those who also might not have books which were very clear about typedefs.... My impression now, preparing my shoulder for more, is that typedef is tacked in front of a normal declaration in order to have the name treated as the name of a type rather than the name of an object, and that declaring a variable of the derived type is equivalent to making a non-typedef declaration exactly like that to which typedef was prepended, only with the new variable name occurring exactly where the derived type name was in the typedef declaration. In other words: type embellished-name says "name is an object, and the application of the given embellishements to this object yields a value of the leading type". Note: put "tag" in place of "object" when the name refers to an array or other composite that is not strictly an object. So, float (*thing)(int); says, "thing is an OBJECT whose indirection is a function of one int parameter whose result is a float". A pointer to a float function of int. float (*thing[23])(int); says, "thing is the TAG of a 23-member array of objects whose indirections are tags of functions with int parameters which return float values." Or, "23-member array of pointers to float functions of int". (Array names are not strictly objects, right? Like a pointer, a direct reference to it yields an address value, but unlike a pointer the array name's value itself cannot be changed.) typedef type embellished-name says "name is a type, objects of which yield values of the base type when subjected to the prescribed embellishments". And therefore, typedef float (*thing[23])(int); says, "thing is NOT an object or a TAG, but a TYPE, and tags of this TYPE are 23-member arrays of pointers to float functions of int". -- Avery Ray Colter {apple|claris}!netcom!avery {decwrl|mips|sgi}!btr!elfcat (415) 839-4567 "I feel love has got to come on and I want it: Something big and lovely!" - The B-52s, "Channel Z"