在分析核心原始碼的時候,會碰到各種奇怪的巨集定義,憑自己腦子分析,感覺完全轉不過來,不得不感嘆c語言確實強大。
廢話少說,下面給出乙個例項
分析uboot的時候,遇到這種巨集,完全懵逼
下面給出具體的解決過程
1、找到在**引用這個巨集的
2、將巨集定義和引用巨集的**放到乙個c檔案
3、gcc ***.c -e -o ***.i進行預處理
原始碼是這樣的
/*
遇到不會解析的巨集如何做?
*/struct cmd_tbl_s ;
typedef struct cmd_tbl_s cmd_tbl_t;
#define u_boot_cmd(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name struct_section =
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *ar**)
u_boot_cmd(
boot, 1, 1, do_bootd,
"boot - boot default, i.e., run 'bootcmd'\n",
null
);int main(void)
預處理之後的**
# 1 "test.c"
# 1 ""
# 1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "" 2
# 1 "test.c"
struct cmd_tbl_s ;
typedef struct cmd_tbl_s cmd_tbl_t;
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *ar**)
cmd_tbl_t __u_boot_cmd_boot struct_section =
;int main(void)
核心原始碼 查詢 結構體或者巨集的定義
想要檢視一些結構體的定義,比如struct ip mreq,可以檢視標頭檔案,所有的系統預定義的結構體都在核心源 的 include下有定義,ubuntu裡面是 usr include 比如要找上面提到的struct ip mreq,可以這樣 find usr include name h xarg...
js中bind apply的原始碼解析
bind也是處理this指向的,但是它是預處理this的指向,函式呼叫之後,只是預處理了裡面的this,不會像call一樣自動讓fn執行。要想讓fn執行,我們需要再次呼叫它的返回值 let obj function fn x,y 1 2 var res fn.bind obj,1,2 res 也可以...
OC原始碼中的一些巨集
if define cplusplus define foundation extern extern c else define foundation extern extern endif 表示extern全域性變數,此時並沒有分配記憶體,需要在.m檔案中實現,為了支援c和c 混編 cplusp...