2014年4月9日 星期三

typedef 與 link list的配合使用

今天要建立一個link list,
必定要使用到struct,
例如:

struct node_tag {
  int data;
  struct node_tag *link;
};
就是建立一個struct,而這一個struct裡面也有一個成員,
剛好就是這一個建立的struct。

而在使用這一個struct時,
直接宣告
struct node_tag Object;
Object.data = 2;
Object.link = NULL;

就可以了。

但是為了讓可讀性更好,
我嘗試修改為
typedef struct node_tag {
  int data;
  struct node_tag *link;
} node;
如此一來,在使用這一個struct時,
直接宣告
node Object;
Object.data = 2;
Object.link = NULL;


雖然這樣已經很不錯了,
但是,我希望可以更簡化。

修改如下
typedef struct node_tag {
  int data;
  node *link;
} node;

但是,這樣會有錯誤,
error: expected specifier-qualifier-list before 'node'
因為在宣告link的時候,
typedef struct node_tag node;
還沒有被建立完成。

此時,我天馬行空的想了一下,
typedef應該是標記某兩個label是同一個東西,
這個東西應該在compiler的時候不會被檢查,而是在link的時候,被指到同一個地方。
因此,我把內容改成如下:
typedef struct node_tag node;
struct node_tag {
  int data;
  node *link;
};
這樣就可以過了,
而且還蠻簡化的。

而我另外還看到另一個寫法
typedef struct node {
  int data;
  struct node *link;
} node;
這樣雖然完成typedef前跟完成type後,都是使用node為名稱,
但是,在定義node的內容仍出現struct node *link;
因此,這一個方式我個人不會採用。

========== 外記 ==========
另外有額外遇到一個情況,我宣告完typedef在h檔之後,
自定的函式的第一個參數Compiler仍出現錯誤。
error: expected ')' before '*' token
這一個錯誤就是沒有認到這一個typedef,
不過,我覺得很奇怪,
我定義typedef在a.h
而b.h宣告這一個function,
同時,b.h也有include a.h,
為什麼會認不到呢?

最後找到原因是,
我在b.h也有include a.h
因此在這一次的Compiler事實上是a.h去include b.h,
然後拿去Compiler,
因此,此宣告的函式是在typdef位置的上面,所以才會出現Compiler ERROR。

解法是在a.h拿掉b.h,
而直接把b.h加在a.c裡面。

之前我的習慣是把要加的.h檔都加在.h裡面,
原來還會遇到這個問題啊~

參考資料:
typedef
Linked list: function with a struct ptr parameter in header file error
LinkedList Struct Typedef in C

沒有留言: