利用巨集來求出結構體成員的一些資訊

2021-09-27 03:42:57 字數 1645 閱讀 2344

1

#define offsetof(type, member) ((size_t) & ((type *)0)->member )

巨集功能:獲得乙個結構體變數成員在此結構體中的偏移量。

1. ( (type *)0 ) 將零轉型為type型別指標;

2. ((type *)0)->member 訪問結構中的資料成員;

3. &( ( (type *)0 )->member )取出資料成員的位址,即相對於0的偏移量,要的就這個;

4.(size_t)(&(((type*)0)->member))結果轉換型別,size_t應該最終為unsigned int型別。

此巨集的巧妙之處在於將 0 轉換成(type*),這樣結構體中成員的位址即為在此結構體中的偏移量。

示例:

#include 

#define offsetof(type, member) ((int)(&((type *)0)->member))

struct _test_

;int main(void)

執行後結構為:temp = 8。

顯然求出了 結構體成員變數 z 在結構體中的偏移量為 8。

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

巨集功能:從結構體(type)某成員變數(member)指標(ptr)來求出該結構體(type)的首指標。

#include 

#define offsetof(type, member) ((int)(&((type *)0)->member))

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

struct _test_

;void assignment(struct _test_ *t)

void getheadpoint(int *tz)

int main(void)

執行結果為:

line31 = 2

line43 tmp - >x = 1

大概解釋一下:先定義乙個結構體並給其賦值,現在 getheadpoint函式只傳入這個結構體的乙個子成員變數位址。在 getheadpoint函式中通過container_of巨集來獲得此結構體的首指標,通過此首指標即可以獲得此結構體的其它子成員的值。

1、.typeof( ( (type *)0)->member )為取出member成員的變數型別。

2、定義__mptr指標ptr為指向該成員變數的指標

3、mptr為member資料型別的常量指標,其指向ptr所指向的變數處

4、.(char *)__mptr轉換為位元組型指標。(char *)__mptr - offsetof(type,member))用來求出結構體起始位址(為char *型指標),然後(type *)( (char *)__mptr -offsetof(type,member) )在(type *)作用下進行將位元組型的結構體起始指標轉換為type *型的結構體起始指標。

5、.()這個擴充套件返回程式塊中最後乙個表示式的值。

C語言使用巨集來控制結構體裡的成員定義

這裡只是記錄下c語言裡使用巨集來控制結構體裡成員定義。在閱讀linux核心原始碼時,會發現很多結構體裡都有各種巨集開關,來控制是否定義某個成員變數。下面自己寫個簡單的程式驗證下,include define switch struct teststruct int main void printf ...

C語言基礎六(結構體以及一些巨集定義)

結構體宣告時,成員大小必須確定,因此不能有未定義大小的資料型別作為成員,同樣也不能用函式作為結構體成員。但是,每個系統指標型別的大小是確定的,所以可以以結構體指標或者函式指標作為結構體成員。結構體位元組對齊 結構體變數本身從4位元組對齊的位置開始存放。整個結構體所佔空間還要是成員中 佔位元組最大的基...

有關結構體的一些題目

1 設有下面的結構體和結構變數定義 struct student 關於結構體型別變數賦值正確的是 a studl.id 1001 studl.name tom b id 1001 studl.name tom c studl.id 1001 studl.name tom d studl.id 100...