Quagga裡面的巨集定義

2021-06-17 21:11:05 字數 2150 閱讀 2941

以前在看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...