Weird gcc behaviour with function pointer types

Roger Miller roger.miller at nova-sol.com
Thu Mar 29 22:39:07 CEST 2007


On Mar 29, 3:05 am, greg <g... at cosc.canterbury.ac.nz> wrote:
> In my quest to eliminate C compiler warnings from
> Pyrex output, I've discovered some utterly bizarre
> behaviour from gcc 3.3.
>
> The following code:
>
>    void g(struct foo *x) {
>    }
>
>    void f(void) {
>      void (*h)(struct foo *);
>      h = g;
>    }
>
> produces the following warning:
>
>    blarg.c: In function `f':
>    blarg.c:6: warning: assignment from incompatible pointer type
>
> However, adding the following line at the top:
>
>    typedef struct foo Foo;
>
> makes the warning go away. The mere *presence* of
> the typedef is all that's needed -- it doesn't even
> have to be used.
>
> This looks like a bug in gcc to me -- what do people
> think?
>
> --
> Greg

If there is no outer declaration of struct foo visible to both
functions
gcc is right (it usually is when it comes to C technicalities).  The
scope
of a struct declared inside a parameter list is limited to the
parameter
list itself, so the two "struct foo"s are technically different types.
Adding the typedef provides a common declaration of struct foo that is
shared by both functions.  You don't really even need a typedef; a
global
declaration of just "struct foo;" should make the problem go away.

I would have expected gcc to also warn you about declaring a struct
inside
a parameter list.  Did you get any warnings like that?




More information about the Python-list mailing list