2011-07-30 10 views
7

Muszę odwołać się do struktury, która nie została jeszcze zdefiniowana, ponieważ struktura faktycznie zawiera prototyp funkcji typedef'd.Prototyp funkcji C typedef ze strukturą próbującą odwoływać się przed zdefiniowaniem.

Na przykład

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; 

Jaki jest prawidłowy sposób, aby rzeczywiście napisać ten kod/nagłówek?

Odpowiedz

4

Tylko do przodu zadeklarować odpowiednie typy - i można zrobić część wskaźnika funkcją 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; 
+0

Czy to zadziała, jeśli przekażę funkcję zwrotną, która używa na przykład: 'int callback (X * x, void * ctx)', czy kompilator będzie narzekał, że 'X' różni się od' struct X'? –

+0

Przepraszam, naprawiłem to - generalnie wolę nadać "struct" i jego typedef różne nazwy, dzięki czemu można jednoznacznie odnieść się do obu w razie potrzeby. Zobacz edycję. –

0

Tak, możesz przesłać dalej deklaruj strukturę i użyj jej w deklaracji MyCallbackFunction, gdzie nie potrzebujesz jej do kompletnego typu.

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

Tylko do przodu zadeklarować swój typedef s

typedef struct X X; 
typedef struct CallbackData CallbackData; 

a następnie zadeklarować struct s później.

Powiązane problemy