2011-02-14 35 views
0

List.h定義了一個名爲list_entry的宏,它是container_of()函數的包裝器。 優雅的功能,這似乎很微妙:Container_of()不編譯

考慮這段代碼:

tmp = list_entry(pos,(struct Order),ord_Queue); 

當我編譯使用gcc,預計表達的恆定錯誤彈出。

我的結構定義爲:

struct Order 
     { 
     double idNum; 
     char* entryTime; 
     char* eventTime; 
     struct list_head ord_Queue; 
     }; 

似乎有與container_of一個問題,當有在Arg2所得和ARG3使用多餘的括號,並且應該只有Arg1的禮貌here一個支架。我試過了,但它不起作用。

一些幫助,將不勝感激。

+0

你有沒有試過擺脫`struct Order`周圍的`(`和`)`?正如編譯器告訴你的那樣,struct Order不是一個表達式,因此不能任意被(和)哪個 - 圍繞上下文爲函數或宏提供參數 - 僅用於對子表達式進行分組 – 2011-02-14 10:34:56

+0

是的,我首先開始使用它,但它仍然抱怨,然後在閱讀上面給出的鏈接之後,我添加了括號。仍然沒有編譯。最後,我試圖解決整個宏,並嘗試使用相同的量身定做來解決手頭的問題(使用固定的數據類型),但它仍然沒有正確編譯。最後,它帶來了預取問題。所以是的,我嘗試了我所能想到的所有可能性(有趣的是,當我不使用宏並在我的代碼中使用它的定義時,編譯器不停地抱怨,直到一切都沒有被括起來) – Soham 2011-02-14 11:33:01

回答

2

從內核複製時可能在list.h中有錯誤? (假設你在這裏做一個用戶空間程序。)因爲你的示例代碼(被剝離了一點)不會用已知好的實現進行編譯。

#include <libHX/list.h> 
struct order { 
     struct HXlist_head ord_queue; 
}; 
int main(void) { 
     struct HXlist_head *pos; 
     struct order *o = HXlist_entry(pos, struct order, ord_queue); 
} 
+0

我不認爲list.h本身就存在一些問題,但肯定存在背播問題。 – Soham 2011-02-14 20:24:29

2

我相信你錯過了包含「offsetof」宏以及內部由container_of()使用的宏。嘗試包括以下代碼(而不是包括全list.h.

#include <sys/types.h> 
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 
#define container_of(ptr, type, member) ({      \ 
      const typeof(((type *)0)->member) *__mptr = (ptr); \ 
      (type *)((char *)__mptr - offsetof(type,member));}) 

#define list_entry(ptr, type, member) \ 
    container_of(ptr, type, member) 

struct list_head { 
    struct list_head *next, *prev; 
}; 

而且也沒有必要在第二個參數添加額外的括號的,它應該能正常運行離不開它。 我希望這應該工作。