#define offsetof(type, member) ((size_t) &((type*)0)->member)
對這個巨集的講解我們大致可以分為以下4步進行講解: 1
>
( (type *)0 )
0位址強制"轉換
" 為type
結構型別的指標;
2>
((type *)0)->member
訪問type
結構中的
member
資料成員;
3>
&( ( (type *)0 )->member)
取出type
結構中的資料成員
member
的位址;
4>
(size_t)(&(((type*)0)->member))
結果轉換為
size_t
型別。巨集
offsetof
的巧妙之處在於將
0位址強制轉換為
type
結構型別的指標,
type
結構以記憶體空間首位址
0作為起始位址,則成員位址自然為偏移位址。可能有的讀者會想是不是非要用
0呢?當然不是,我們僅僅是為了計算的簡便。也可以使用是他的值,只是算出來的結果還要再減去該數值才是偏移位址。來看看如下的**:
#include
#defineoffsetof(type, member) ((size_t) &((type *)4)->member)
struct test_struct ;
int main(void)
執行結果為:
jibo@jibo-virtualbox:~/cv_work/work/list/offset $ ./main
offsetof (struct test_struct,num) =0
offsetof (struct test_struct,ch) =4
offsetof (struct test_struct,f1) =8
為了讓大家加深印象,我們在**中沒有使用
0,而是使用的
4,所以在最終計算出的結果部分減去了乙個
4才是偏移位址,當然實際使用中我們都是用的是0。
#include
#defineoffsetof(type, member) ((size_t) &((type *)0)->member)
struct test_struct ;
int main(void)
執行結果為:
jibo@jibo-virtualbox:~/cv_work/work/list/offset $ ./main
offsetof (struct test_struct,num) =0
offsetof (struct test_struct,ch) =4
offsetof (struct test_struct,f1) =8
C C 巨集講解
眾多c 書籍都忠告我們c語言巨集是萬惡之首,但事情總不如我們想象的那麼壞,就如同goto一樣。巨集有 乙個很大的作用,就是自動為我們產生 如果說模板可以為我們產生各種型別的 型別替換 那麼巨集其實可以為我們在符號上產生新的 即符號替換 增加 關於巨集的一些語法問題,可以在google上找到。相信我,...
C,C 巨集中 與 的講解
文中 file 與示例1的可以參見 使用ansi c and microsoft c 中常用的預定義巨集 巨集中的 的功能是將其後面的巨集引數進行字串化操作 stringizing operator 簡單說就是在它引用的巨集變數的左右各加上乙個雙引號。如定義好 define string x x之後...
C,C 巨集中 與 的講解
文中 file 與示例1可以參見 使用 ansi c and microsoft c 中常用的預定義巨集 巨集中的 的功能是將其後面的巨集引數進行字串化操作 stringizing operator 簡單說就是在它引用的巨集變數的左右各加上乙個雙引號。如定義好 define string x x之後...