typedef gripe

Joaquim Martillo martillo at mit-athena.ARPA
Fri Oct 5 15:52:06 AEST 1984


>>     "setjmp foo, *tmp; tmp = &foo;" is accepted with no complaints by my C
>> compiler (based on the Dennis Ritchie V7 PDP11 "cc"), as it should be, because
>> "tmp" and "&foo" have exactly the same (defined) type.  Either your C compiler
>> has a bug in this respect, or your <setjmp.h> is #defining jmp_buf, instead of
>> typedefing it.  The thing to do is not gripe about the language, but gripe to
>> whomever maintains your compiler, to get this bug fixed.
>> -- 
>> 			    Morris M. Keesan
>> 			    {decvax,linus,ihnp4,wivax,wjh12,ima}!bbncca!keesan
>> 			    keesan @ BBN-UNIX.ARPA
>
>Consider the following:
>    char    c[10], *cptr;
>
>    cptr = c;
>
>    Clearly "c", without any subscripts is equivlent to "*cptr", I've yet to
>see a C compiler complain about THAT line.  This means that "c" is a "pointer
>to character", NOT a pointer to an array of characters.  Therefore taking
>its address is equivilent to "&cptr", or asking for the address of the actual
>pointer.
>    Conceptually, "typedef" ought (my definition of ought) make the type into
>an abstract object, which no longer depends upon the fact that it used to be an
>array.  In fact it does not, and thus:
>
>    typedef char jmp_buf[10];
>    jmp_buf c, *cptr;
>
>    cptr = &c;
>
>ends up being incorrect.
>
>Now, just in case you think my compiler is strange (Apollo CC).  Here is
>the Berkeley 4.2 example.
>
>    %8% cat foo.c
>    typedef char jmp_buf[10];
>    main()
>    {
>            jmp_buf c, *cptr;
>    
>            cptr = c;
>            cptr = &c;
>            cptr = (jmp_buf *) &c;
>            cptr = (jmp_buf *) c;
>    }
>    %9% cc foo.c
>    "foo.c", line 6: warning: illegal pointer combination
>    "foo.c", line 7: warning: & before array or function: ignored
>    "foo.c", line 7: warning: illegal pointer combination
>    "foo.c", line 8: warning: & before array or function: ignored
>    %10% 
>----------------------
>Apollo CC
>----------------------
>-=> catf foo.c
>    typedef char jmp_buf[10];
>    main()
>    {
>            jmp_buf c, *cptr;
>    
>            cptr = c;
>            cptr = &c;
>            cptr = (jmp_buf *) &c;
>            cptr = (jmp_buf *) c;
>    }
>-=> cc foo.c
>
> (0006)             cptr = c;
>******** Line 6: Warning:  Illegal pointer combination: incompatible types.
>
> (0007)             cptr = &c;
>******** Line 7: Warning:  Illegal pointer combination: incompatible types.
>No errors, 2 warnings, C Compiler, Rev 2.40
>
>--------------------------------------------------
>Now I'm not saying that Berkeley has the right error messages either,
>in particular the complaints about the '&'s are completely out of place
>given that typedef is *supposed* to make things more data independant.
>I might note however, that our version of PCC also complains about 
>incompatable types (although not the '&').
>
>What's the correct answer?  I don't know.  Probably the best thing to do
>is avoid typedef'ing arrays completely.
>
>
>                                            -kee
>                                ...decvax!wivax!apollo!nazgul
>
>
>

Apollo is correct and Berkeley is wrong at least as I understand how C
compilers work at ATT.  A jmp_buf is not exactly an array.  It is a
fixed length, array, i. e. a block of memory of known size a.k.a
structure.  Thus at ATT if new_jmp_buf and old_jmp_buf are defined as
jmp_buf's 

		jmp_buf new_jmp_buf, old_jmp_buf;

		..........		/* Fill up old_jmp_buf */

		..........

		new_jmp_buf = old_jmp_buf;

works (or should work).

Therefore, just as

		struct tag node, *p = &node;

works so should

		jmp_buf save, *p = &save;

also work.



More information about the Comp.lang.c mailing list