2013-12-16 36 views
0

在linux內核中有一個struct XX,它包含一個struct list_head YY檢索list_head對象的父結構

現在給出一個指向struct XX對象的指針,我想要查找鏈接列表中的所有XX結構。所以我會通過list_head結構,然後找到相應的父結構。

但這裏的第二步似乎不適用。所以我不確定是否有可能實現這一點。

例子:

struct XX { 
    ... 
    struct list_head YY; 
}; 
+0

你能舉一個你問什麼的例子嗎?這個問題不明確。 – Mike

+0

@Mike添加了結構XX定義 – daisy

回答

0

我想你是問如何找到包含給定列表節點(你有一個指針)的對象。如果是這樣,你想這個宏的一些變種:

//given the address of a member, find the address of the object containing the member. 
    #define GetObjectFromMember(ObjectType,MemberName,MemberPointer) \ 
      ((ObjectType *)(((char *)MemberPointer) - ((char *)(&(((ObjectType *)0)->MemberName))))) 

給定一個結構美孚和成員m_bar,指針,P,以實例的m_bar:

Foo *foo = GetObjectFromMember(Foo,m_bar,p); 
ASSERT(&foo->m_bar == p); 

我用的這個宏大量的回調,我把一個指向回調對象的指針(比如一個定時器)並且需要找到周圍的對象指針。由於linux內核使用入侵列表,我確信它已經有了這個宏,但我從來沒有真正去尋找它。

+0

從技術上講,宏有點棘手 - 它取決於特定的未定義行爲以特定方式行爲。理想情況下,您應該使用平臺供應商提供的宏,例如Linux上的container_of或Windows DDK上的CONTAINING_RECORD。這些將保證與您正在使用的編譯器一起工作。 – Stewart

+0

我一直在使用這個精確的跨平臺超過15年,所以我非常確定它是穩定的。由於虛擬繼承,此宏在C++中存在問題。這個宏由模板版本涵蓋,但這個問題沒有涉及。 – Speed8ump

+0

雖然它仍然是未定義的行爲根據C和C++語言。這並不意味着你不應該使用它,但它是你需要知道的。這是我的觀點。 – Stewart