在Linux內(nèi)核中,container_of宏通常用于從結(jié)構(gòu)體中獲取包含該結(jié)構(gòu)體的另一個(gè)結(jié)構(gòu)體的指針。這在內(nèi)核中經(jīng)常用于實(shí)現(xiàn)鏈表、樹等數(shù)據(jù)結(jié)構(gòu)。
container_of宏的定義如下:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type, member) ); })
在使用container_of宏時(shí),需要傳入3個(gè)參數(shù):指向成員變量的指針ptr、包含該成員變量的結(jié)構(gòu)體類型type和成員變量在結(jié)構(gòu)體中的名稱member。
以下是一個(gè)示例代碼,在這個(gè)示例中,我們定義了一個(gè)結(jié)構(gòu)體struct data,其中包含一個(gè)成員變量value和一個(gè)成員變量list_entry,然后通過container_of宏從list_entry指針中獲取包含該結(jié)構(gòu)體的指針:
#include <stdio.h>
#include <stddef.h>
struct data {
int value;
struct list_head list_entry;
};
int main() {
struct data my_data;
struct list_head *list_ptr = &my_data.list_entry;
struct data *data_ptr = container_of(list_ptr, struct data, list_entry);
printf("Value: %d\n", data_ptr->value);
return 0;
}
在這個(gè)示例中,我們通過container_of宏從list_entry指針中獲取了包含該結(jié)構(gòu)體的指針data_ptr,并打印出了value的值。