Linux下的兩個經典巨集定義 轉

2021-09-07 13:48:09 字數 1488 閱讀 1885

offsetof巨集定義:

// 獲得結構體(type)的變數成員(member)在此結構體中的偏移量。

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

說明:獲得結構體(type)的變數成員(member)在此結構體中的偏移量。

1.( (type *)0 ) 將零轉型為type型別指標,即type型別的指標的位址是0。

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

3.&( ( (type *)0 )->member )  取出資料成員的位址。由於type的位址是0,這裡獲取到的位址就是相對member在type中的偏移。

4.(size_t)(&(((type*)0)->member))  結果轉換型別。對於32位系統而言,size_t是unsigned int型別;對於64位系統而言,size_t是unsigned long型別。

使用示例:

struct student

;int _tmain(int argc, _tchar* ar**)

//結果:

/*gender_offset = 0 

id_offset = 4 //位元組對其

type是結構體,它代表"整體";而member是成員,它是整體中的某一部分。

container_of巨集定義:

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

說明:根據"結構體(type)變數"中的"域成員變數(member)的指標(ptr)"來獲取指向整個結構體變數的指標。

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

2.const typeof( ((type *)0)->member ) *__mptr = (ptr)    定義變數__mptr指標,並將ptr賦值給__mptr。經過這一步,__mptr為member資料型別的常量指標,其指向ptr所指向的位址。

3. (char *)__mptr    將__mptr轉換為位元組型指標。

4. offsetof(type,member))    就是獲取"member成員"在"結構體type"中的位置偏移。

5. (char *)__mptr - offsetof(type,member))    就是用來獲取"結構體type"的指標的起始位址(為char *型指標)。

6.(type *)( (char *)__mptr - offsetof(type,member) )    就是將"char *型別的結構體type的指標"轉換為"type *型別的結構體type的指標"。

7.反斜槓「/」表示行連線

linux下安裝cmake的兩個方法

inux下安裝軟體的原始碼包很多都需要使用cmake進行編譯,因此需要我們先給linux系統安裝cmake 你或許聽過好幾種 make 工具,例如 gnu make qt 的 qmake 微軟的 ms nmake,bsd make pmake makepp,等等。這些 make 工具遵循著不同的規範...

計算網格的兩個定義

科學領域驅使網格構建的源動力是在不同機構間協作的需求 聚集計算資源充分利用閒置的處理器週期的契機 資料量和計算需求超出了現有巨型計算機處理能力。因此計算網格最基本的定義為 在多種體系的動態環境下協作資源共享以及解決同樣問題。如果您把網際網路看作通訊網路,那麼網格計算就是計算網路 用於合用資產之間協調...

兩個lock的經典使用示例

示例一 public class numberprintdemo catch interruptedexception e 當state 1時,輪到執行緒1列印5次數字 for int j 0 j 5 j system.out.println 執行緒1列印完成後,將state賦值為2,表示接下來將輪...