2013-06-04 26 views
1

假設這個方案:的typedef不妨礙關鍵字struct一個struct

/* avl.c */ 

typedef struct avl { 
    void *data; 
    int height; 
    struct avl *left, *right; 
} node; 

/* avl.h */ 

struct avl; /* opaque */ 

我想用:

struct node *root; 

,而不是

node *root; 
在avl.c

,但對於現在我發現的最好的是:

struct avl { 
    void *data; 
    int height; 
    struct avl *left, *right; 
}; 

#define node avl 

另一種方式?

+4

你試圖解決什麼(更高水平)的問題? – pmg

回答

3

除了使用宏來做到這一點,沒有別的辦法。原因是struct標籤有自己的名稱空間。即使結構包含相同的成員類型,標記名稱空間中的不同名稱也始終指向不同的類型。類型的正確別名只能通過typedefs完成,這些類型定義是定義的是別名而不是單獨的類型。

3

那麼你應該刪除typedef

struct node{ 
    void *data; 
    int height; 
    struct node *left, *right; 
} 
+0

謝謝,但我想在avl.c中將指定爲結構節點,並且在項目的其餘部分中將指向 –

+0

我不明白爲什麼要使用具有兩個不同名稱的結構類型,但是您的' #define'會做到這一點。 – gkovacs90

3

不使用預處理,你必須給結構和類型定義相同的名稱爲工作,例如

typedef struct node { 
     void *data; 
     int height; 
     struct node *left, *right; 
    } node; 

所以現在struct nodenode是同樣的事情。

+0

對,但現在我想要一個名爲'struct avl'(不簡單地稱爲'avl')的不透明結構作爲別名 –

+0

@DavidRF這意味着您需要執行一些預處理器模糊處理。 – nos

1
struct avl { 
    void *data; 
    int height; 
    struct avl *left, *right; 
}; 

typedef struct alv node; 

struct avl* ptr1; //valid 
avl* ptr1; //not valid 
struct node* ptr2; //valid 
node* ptr3; //also valid 

,迫使你用struct avl,不強迫你使用struct node,但你可以的,如果你想。

+0

謝謝@zakinster,但似乎不能在avl.c之外使用不透明結構 –