offsetof marco
Reference : http://www.cplusplus.com/reference/cstddef/offsetof/
offsetof 這個marco主要是取的struct的member的相對位置
例如:
struct book {
char author[8];
int price ;
char publisher[20];
}
X+0 +--------------------------+
+ char author[8] +
X+8 +--------------------------+
+ int price +
x+12 +--------------------------+
+ char publisher[20] +
+--------------------------+
所以我要找到struct book中的publisher的相對位址只要用offsetof就可以找到了
Example:
offsetof(struct book, publisher) 會傳回 12
Code:
#include <stdio.h>
#include <stddef.h>
struct book {
char author[12];
int price ;
char publisher[20];
};
int main(int argc, const char *argv[])
{
printf("offset : %d\n",(int)offsetof(struct book, author));
printf("offset : %d\n",(int)offsetof(struct book, price));
printf("offset : %d\n",(int)offsetof(struct book, publisher));
return 0;
}
接著來看這個marco是如何取的struct的member的offset
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
((TYPE *)0)這個等同於 (struct book*)0 意思就是取的struct book 的 X+0的這個位置
接著 &(struct book*)0->publisher就是取的publisher的位置接著在轉成(size_t)的型態
以前學C的時候,也不會看到這種寫法 @@ 只有現在想知道linux kernel到底做了什麼才會慢慢一步一步去瞭解每個函數跟marco到底做了什麼。但看懂之後就覺得真好玩 XD
留言