Path: utzoo!attcan!uunet!seismo!sundc!pitstop!sun!oliveb!orc.olivetti.com!chase From: chase@orc.olivetti.com (David Chase) Newsgroups: comp.lang.c Subject: Declaration puzzler (another old question?) Message-ID: <30091@oliveb.olivetti.com> Date: 4 Oct 88 01:16:20 GMT Sender: news@oliveb.olivetti.com Reply-To: chase@orc.olivetti.com (David Chase) Organization: Olivetti Research Center, Menlo Park, CA Lines: 67 I can't figure out how to declare the type of an array with (say) 10 elements, each of which is that array type. That is, I want the non-error effect of typedef foo *(foo[10]); Both the SunOS 3.4 C compiler and the GCC 1.28 compiler hate this declaration. The word from Harbison and Steele 2 appears to be (5.4, p. 93) "If T is any C type except void or 'function returning ...,' the array type 'array of T' may be declared." Clearly, no matter what "foo *" is, it is not void, and it is not a "function returning ...". The word from Kernighan and Ritchie 2 appears to be (A8.9, p. 221) "typedef does not introduce new types, only synonyms for types that could be specified in another way." and (A8.6.2, p 217) "Any type from which an array is constructed must be complete; it must not be an array or structure of incomplete type." I can succeed, however, if I wrap the array up in a structure, as in struct mumble { struct mumble * children[10]; }; or typedef struct mumble * glop; struct mumble { glop children[10]; }; This is all a little puzzling to me. If I didn't know that C was wonderful, I might think that arrays were a second-class type. It's nice to know that the Good Books still need High Priests to interpret them. Pass me the incense and a dead chicken, please. By the way, (in reference to a discussion on Duff's device), both compilers mentioned above to fairly reasonable things with the following apparently legal (based on a quick scan of H&S 2) trick: typedef int bogus[1000]; typedef struct { bogus x; } * bogus_wrapper; bogus a,b; ... * (bogus_wrapper) a = * (bogus_wrapper) b; (Sun spit out a very tight loop, Gcc called bcopy.) Oh well. Back to work. I don't know why I ask questions like this, since I already know the answer. David (chase@orc.olivetti.com, or oliveb!orc!chase, but NOT oliveb!chase)