2011-07-30 14 views
7

Ben yapı aslında typedef 'işlevi prototip conatins çünkü henüz tanımlanmış değil bir yapı başvurmak gerekir. Örneğin Cı Typedef fonksiyonu prototip.

,
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; 

aslında bu kodu/başlığını yazmak için geçerli yolu nedir

?

cevap

4

Hemen ileri alakalı türleri beyan - ve typedef işlevi işaretçisi bölümünü yapabilirsiniz:

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

Will bu işi ben mesela kullanan bir geri arama işlevi geçerse: 'int geri arama (X * x, void * ctx)' ya olacak derleyici 'X'' yapı X' farklı olduğunu şikayetçi? –

+0

Üzgünüm, bunun için sabit - Ben genellikle gerektiği gibi açık bir biçimde hem başvurabilmeniz için 'struct' ve typedef farklı adlar vermeyi tercih ederim. Düzenle'ye bakın. –

0

Evet, yapı bildirmek iletmek ve tam bir tip olması buna ihtiyacı yoktur nerede MyCallbackFunction beyanında kullanabilirsiniz.

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

Hemen öne typedef s

typedef struct X X; 
typedef struct CallbackData CallbackData; 

beyan ve ardından ilan Daha sonra struct s.