[問題] 請益一段程式碼

看板C_and_CPP作者 (j5128709)時間8年前 (2016/04/29 22:16), 編輯推噓3(307)
留言10則, 6人參與, 最新討論串1/1
請教各位高手 最近在研究嵌入式系統 看到一段程式碼 部份有些疑問想請教 /*##### 宣告 ##### */ typedef struct _dlink{ dlink_t head; }dlink; typedef struct _dlink_t{ struct _dlink_t *prev; struct _dlink_t *next; }dlink_t; typedef struct _u_idle_t{ dlink_t link; u_idle_callback_t idle; }u_idle_t; typedef void (*u_idle_callback_t) (void); dlink idle_l; /*##### 程式碼 #####*/ do { dlink_t *entry; for ( (entry) = (&idle_1)->head.next; (entry) != &(&idle_1)->head; (entry) = (entry)->next; ) { u_idle_t *idle = ( (u_idle_t*) ((u8 *) (entry) - (u8 *) (&((u_idle_t *) 0)->link ))); //Q1 idle->idle(); } //end for }while(0); 想問說 Q1 這行的該如何解釋? 這"0"是說位址嘛? 還是說有啥特別用意?? 感謝各位前輩看完 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.41.180.25 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1461939360.A.68F.html

04/29 22:35, , 1F
這看起來像是個 offsetof...
04/29 22:35, 1F

04/29 22:36, , 2F
看這 code 的形式, 你在看的是 macro 展開之後的程式嗎?
04/29 22:36, 2F

04/29 22:56, , 3F
一般是拿來抓object的開頭address. 但是這行怪怪的
04/29 22:56, 3F

04/29 23:24, , 4F
L大 @@ 你猜中了 的確是Macro 我直接帶進去貼出來
04/29 23:24, 4F

04/30 00:36, , 5F
我開始相信 LPH 真的有水晶球了
04/30 00:36, 5F

04/30 00:59, , 6F
L大超神,連這樣都看得出來.....
04/30 00:59, 6F

04/30 01:38, , 7F
水晶球哪裡買?板工也想要....
04/30 01:38, 7F

04/30 09:21, , 8F
不太了解offset 能詳力一點嘛
04/30 09:21, 8F

04/30 09:43, , 9F
詳細 感謝高手們
04/30 09:43, 9F

04/30 12:37, , 10F
我想應該是你要提供這個 macro 的更多細節才是
04/30 12:37, 10F
文章代碼(AID): #1N8soWQF (C_and_CPP)