PyroAVR
PyroAVR

Reputation: 729

Co-Dependent Definitions in C

Suppose we have a function pointer on a struct, which has the struct itself as the first argument, a typical callback scenario.

typedef void (*callback_type)(my_struct_type *mst, int whatever);

typedef struct {
    // lots of fun stuff
    callback_type notify_me;
} my_struct_type;

This produces a compiler error on the first typedef, as one might expect. error: unknown type name my_struct_type. Reversing the definitions produces the same result, but the unknown type is callback_type.

The easy solution is to do the following:

typedef struct my_struct_type_S {
    // lots of fun stuff
    void (*notify_me)(my_struct_type_S *mst, int whatever);
} my_struct_type;

However, doing this elides the function pointer type definition, which it would be nice to be able to easily refer to later, and use for static type checks, nice error messages, etc.

Any suggestions on how to resolve this?

Edit on "possible duplicate": This scenario involves function pointer typedefs that are arcane to many people. I think this is a good example for that case, and additionally, the accepted answer is very clean, clear, and simple.

Upvotes: 4

Views: 119

Answers (2)

dbush
dbush

Reputation: 224112

You can do this by giving the struct a tag and using a forward declaration of the struct. Then you can use the typedef for the function pointer, and subsequently complete the definition of the struct.

typedef struct my_struct_type_S my_struct_type;

typedef void (*callback_type)(my_struct_type *mst, int whatever);

struct my_struct_type_S {
    // lots of fun stuff
    callback_type notify_me;
};

Upvotes: 6

chriptus13
chriptus13

Reputation: 717

You need to define the tag of the struct

typedef void (*callback_type)(struct _my_struct_type *mst, int whatever);

typedef struct _my_struct_type {
    // lots of fun stuff
    callback_type notify_me;
} my_struct_type;

Upvotes: 3

Related Questions