以前在看quagga原始碼的時候,被裡面的巨集定義搞殘了,根本看不懂啊,今天再回頭看了2小時多,還是不懂啊,就在要放棄的時候,我按照c語言巨集的定義開始將這個巨集一步步展開,發現居然被我搞定了,不容易。。。
quagga的命令是以巨集來定義的,如zebra的「link-detect」命令,是在「zebra/inte***ce.c」中宣告實現的:
defun (linkdetect,
linkdetect_cmd,
"link-detect",
"enable link detection on inte***ce\n")
defun是乙個巨集,定義在「lib/command.h」,見:
#define defun(funcname, cmdname, cmdstr, helpstr) \
defun_cmd_func_decl(funcname) \
defun_cmd_element(funcname, cmdname, cmdstr, helpstr, 0, 0) \
defun_cmd_func_text(funcname)
接著遞迴,defun展開還是三個巨集定義:
#define defun_cmd_element(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
struct cmd_element cmdname = \
;#define defun_cmd_func_decl(funcname) \
static int funcname (struct cmd_element *, struct vty *, int, const char *);
#define defun_cmd_func_text(funcname) \
static int funcname \
(struct cmd_element *self __attribute__ ((unused)), \
struct vty *vty __attribute__ ((unused)), \
int argc __attribute__ ((unused)), \
const char *argv __attribute__ ((unused)) )
到此就結束了,之前不管怎麼看都看不懂,不得不承認筆者智商平平,就在山窮水盡之際,柳暗花明,筆者嘗試先把巨集展開看看是什麼樣的,第一次展開得到如下結果:
defun_cmd_func_decl(vtysh_end_all) \
defun_cmd_element(vtysh_end_all, vtysh_end_all_cmd, "end", "end current mode and change to enable mode\n", 0, vtysh_all) \
defun_cmd_func_text(vtysh_end_all)
一回生,二回熟,既然接著遞迴把這三個巨集也展開:
static int vtysh_end_all (struct cmd_element *, struct vty *, int, const char *); \
struct cmd_element vtysh_end_all_cmd = \
; \static int vtysh_end_all \
(struct cmd_element *self __attribute__ ((unused)), \
struct vty *vty __attribute__ ((unused)), \
int argc __attribute__ ((unused)), \
const char *argv __attribute__ ((unused)) )
可以看出,
1、defun_cmd_func_decl展開的結果是對函式「vtysh_end_all」進行宣告;
2、defun_cmd_element是定義該命令相應的資料結構;
3、defun_cmd_func_text則是函式該命令相應動作函式的定義;
至此就看懂了,不容易啊,c語言真是難懂啊
定義在結構體裡面的巨集
測試 如下 include struct test void func define st define 20 int main int argc,char ar 輸出 1 10 20總結 1 巨集定義在結構體裡面,只是方便 的閱讀,一般這種情況,大部分是結構體裡面有標誌量,方便閱讀。2 在結構體裡...
定義在結構體裡面的巨集
1 巨集定義在結構體裡面,只是方便 的閱讀,一般這種情況,大部分是結構體裡面有標誌量,方便閱讀。2 在結構體裡面定義乙個巨集,在結構體外面也可以定義同樣的巨集,如果兩個巨集的內容不一樣,那麼在使用的地方,哪個巨集近就使用哪個。編譯會有警告 巨集就是替換,從上面開始,一直往後面替換。如果巨集新定義了,...
linux核心裡面幾個特殊的巨集定義
1.bits to longs nr define bits per byte8 define div round up n,d n d 1 d define bits to longs nr div round up nr,bits per byte sizeof long div round u...