Weird gcc behaviour with function pointer types

Roger Miller roger.miller at
Thu Mar 29 22:39:07 CEST 2007

On Mar 29, 3:05 am, greg <g... at> 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
gcc is right (it usually is when it comes to C technicalities).  The
of a struct declared inside a parameter list is limited to the
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
declaration of just "struct foo;" should make the problem go away.

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

More information about the Python-list mailing list