这里写自定义目录标题
DEFPY
定义
#define DEFPY(funcname, cmdname, cmdstr, helpstr) \
DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
funcdecl_##funcname
cmdname 结构体定义、初始化
/* helper defines for end-user DEFUN* macros */
#define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
static struct cmd_element cmdname = { \
.string = cmdstr, \
.func = funcname, \
.doc = helpstr, \
.attr = attrs, \
.daemon = dnum, \
.name = #cmdname, \
};
DEFUN
#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)
funcname 声明
#define DEFUN_CMD_FUNC_DECL(funcname) \
static int funcname(const struct cmd_element *, struct vty *, int, \
struct cmd_token *[]);
cmdname 结构体定义、初始化
/* helper defines for end-user DEFUN* macros */
#define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
static struct cmd_element cmdname = { \
.string = cmdstr, \
.func = funcname, \
.doc = helpstr, \
.attr = attrs, \
.daemon = dnum, \
.name = #cmdname, \
};
#define DEFUN_CMD_FUNC_TEXT(funcname) \
static int funcname(const struct cmd_element *self \
__attribute__((unused)), \
struct vty *vty __attribute__((unused)), \
int argc __attribute__((unused)), \
struct cmd_token *argv[] __attribute__((unused)))
对比
DEFUN和DEFPY区别
DEFUN
和 DEFPY
都可以定义命令。DEFPY(...)
是 DEFUN()
的增强版,由python/clidef.py进行预处理。python脚本解析命令定义字符串,提取变量名称和类型,并生成一个C语言包装函数,解析变量并传递给它们。这意味着在CLI函数体中,你将收到具有适当类型的额外参数。