Dan Karron@UCBVAX.BERKELEY.EDU (12/11/90)
Not that this means that I cant work, but I notice this apparent (to my mind, anyway) inconsistancy: typedef struct MyTag { MyStruct a; void (*a_subroutine_transfer_address)(MyStruct *s); } MyStruct; This don't fly. typedef struct MyTag { struct MyTag a; void (*a_subroutine_transfer_address)(struct MyTag *); } MyStruct; This does. The argument list should take ansi prototypes, including typedefs and model arguments. What does the ANSI standard say about this...(This is really an arcane incantation) ? Cheers! dan. +-----------------------------------------------------------------------------+ | karron@nyu.edu (E-mail alias that will always find me) | | Fax: 212 340 7190 * Dan Karron, Research Associate | | . . . . . . . . . . . . . . * New York University Medical Center | | 560 First Avenue \*\ Pager <1> (212) 397 9330 | | New York, New York 10016 \**\ <2> 10896 <3> <your-number-here> | | (212) 340 5210 \***\_________________________________________ | | Main machine: karron.med.nyu.edu (128.122.135.3) IRIS 85GT | +-----------------------------------------------------------------------------+
Dan Karron@UCBVAX.BERKELEY.EDU (12/16/90)
>Subject: Re: struck by typedef struct... > >|> typedef struct MyTag { >|> MyStruct a; >|> void (*a_subroutine_transfer_address)(MyStruct *s); >|> } MyStruct; >|> >|> This don't fly. > >I'm no authority on ANSI C (my coworker is), but I see three things wrong >with this: > > 1) The compiler does not recognize MyStruct as a type since it > is not yet defined. > > 2) The compiler does not know what size MyStruct is the first > time you use it. > > 3) The definition of MyStruct is recursive which can't work. > > >|> typedef struct MyTag { >|> struct MyTag a; /* Forward reference is legal. */ >|> void (*a_subroutine_transfer_address)(struct MyTag *); >|> } MyStruct; >|> >|> This does. > >This is slightly better because the compiler understands that "struct MyTag" >is a type, but 2) and 3) are still there. Yes, that bothers me too. But the Good Book Says: Chapter 6.5 Page 139 (ANSI edition) .. This recursive declaration of a node might look chancy, but it's correct. It is illegal for a structure to contain an istance of its self but struct tnode *left; declares left to be a pointer to tnode , not a tnode itself. Sayeth the Good Book in another section Chapter 6.7, Page 146 : It must be emphasized that a typedef declaration does not create a new type in any sense: it merely adds a new name for some existing type.... In effect typedef is like a #define, except that since it is interperted by the compiler, it can cope with textual substitutilns that are beyond the capabilities of a preprocessor. ... > >Perhaps something got lost in the translation here, like you meant the >first field to be a pointer, rather than the struct itself. > You are precisely correct. You get the gold pointed star for astuteness! >-Gary > +-----------------------------------------------------------------------------+ | karron@nyu.edu (E-mail alias that will always find me) | | Fax: 212 340 7190 * Dan Karron, Research Associate | | . . . . . . . . . . . . . . * New York University Medical Center | | 560 First Avenue \*\ Pager <1> (212) 397 9330 | | New York, New York 10016 \**\ <2> 10896 <3> <your-number-here> | | (212) 340 5210 \***\_________________________________________ | | Main machine: karron.med.nyu.edu (128.122.135.3) IRIS 85GT | +-----------------------------------------------------------------------------+