之前一直在看quagga的程序,看到里面的宏的声明神乎其神,通过宏的组合一次性形成多个对象,十分简便。但是也有部分地方看不懂,最终经过请教和提问和自己的尝试才理解,在这里做个小小的总结。
首先,quagga中cmd宏的全貌:
/* DEFUN for vty command interafce. Little bit hacky ;-). */
#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)
/* DEFSH for vtysh. */
#define DEFSH(daemon, cmdname, cmdstr, helpstr) \
DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, 0, daemon) \
/* DEFUN + DEFSH */
#define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) \
DEFUN_CMD_FUNC_DECL(funcname) \
DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon) \
DEFUN_CMD_FUNC_TEXT(funcname)
DEFUN是最常用的宏,它用作直接定义命令结构和命令执行的函数;DEFSH是在VTYSH中使用的宏,它只定义命令结构,而实现的话是通过将命令传到模块,有模块中相应定义的DEFUN中定义的函数实现;DEFUNSH则是二者的组合。