Adam M-W
Adam M-W

Reputation: 3539

C typedef function prototype with struct attempting to reference before defined.

I need to reference a struct that's not yet defined because the struct actually conatins the typedef'd function prototype.

For example,

typedef int (MyCallbackFunction)(X * x, void * ctx);

typedef struct CallbackData {
  MyCallbackFunction * callback;
  void * ctx;
} CallbackData;

typedef struct X {
  char a;
  int b;
  int c;
  double d;

  CallbackData e;
} X;

What's the valid way to actually write this code/header ?

Upvotes: 7

Views: 9537

Answers (3)

Kerrek SB
Kerrek SB

Reputation: 476940

Just forward declare the relevant types - and you can make the function pointer part of the typedef:

struct X_;

typedef int (*MyCallbackFunction)(struct X_ * x, void * ctx);

typedef struct CallbackData_ {
  MyCallbackFunction callback;
  void * ctx;
} CallbackData;

typedef struct X_ {
  char a;
  int b;
  int c;
  double d;

  CallbackData e;
} X;

Upvotes: 5

Jens Gustedt
Jens Gustedt

Reputation: 78903

Just forward declare your typedefs

typedef struct X X;
typedef struct CallbackData CallbackData;

and then declare the structs later.

Upvotes: 5

CB Bailey
CB Bailey

Reputation: 791421

Yes, you can forward declare the struct and use it in the declaration of MyCallbackFunction where you don't need it to be a complete type.

struct X;
typedef int (MyCallbackFunction)(struct X * x, void * ctx);

Upvotes: 0

Related Questions