2014-09-02 20 views
1

如何在參數中傳遞結構類型?我想這是不可能的,仍然想檢查它是否可行。如何在參數中傳遞結構類型?

我的要求是這樣的

下面是在Linux內核中使用宏list_entry

#define list_entry(ptr, type, member) \ 
    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 

我想用函數來重寫。我該怎麼寫?

list_entry(void *ptr, ???, ???) 

有沒有辦法可以做到這一點?

我想寫一個包裝來釋放給定的列表。所以要在我的函數中使用list_entry,我的函數需要通過type和成員來傳遞。可能嗎?

回答

2

list_entry作爲一個函數具有相同的行爲和簽名基本上是不可能的。這是因爲它的參數包括類型和成員名稱,兩者都不是C中的值。另一方面,可以在某種程度上將宏的「代碼」內容抽象爲一個函數:

#define list_entry(ptr, type, member) \ 
    ((type *)f_list_entry(ptr, offsetof(type, member))) 

static void *f_list_entry(void *ptr, size_t offset) 
{ 
    return (char *)(ptr)-offset; 
} 

但正如你所看到的,唯一的實際「代碼」是一個單一的減法。

由於我使用的標準offsetof宏,而不是通過一個貧窮的黑客內核調用的未定義行爲,我也參加了固定型的正確性(size_t而不是unsigned long)的自由。

+0

謝謝你..好主意.. !!! – 2014-09-02 04:06:22