69,377
社区成员
发帖
与我相关
我的任务
分享
#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)
#define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
struct cmd_element cmdname = \
{ \
.string = cmdstr, \
.func = funcname, \
.doc = helpstr, \
.attr = attrs, \
.daemon = dnum, \
};
#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)) )
static int gateway_ecdysis (struct cmd_element *, int, const char *[]);
struct cmd_element gateway_ecdysis_cmd = { .string = "gateway ecdysis", .func = gateway_ecdysis, .doc = "Enable a gateway translation protocol process\n", };
static int gateway_ecdysis (struct cmd_element *self , int argc , const char *argv[] )
{
return 1;
}
擦,展开来看了半天才发现一个是声明一个是实现啊。
谢谢了!#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_CMD_FUNC_DECL是:
#define DEFUN_CMD_FUNC_DECL(funcname) \
static int funcname (struct cmd_element *, struct vty *, int, const char *[]);
而DEFUN_CMD_FUNC_TEXT是:
#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宏中的funcname参数实现定义函数名的,那么就应是两个函数名一样啊,为什么不是重定义呢
我明白你的意思是如果使用不同宏的时候不会重名,但是如果一个宏呢,不是会重名吗?
是不是因为__attribute__ ((unused))的关系,这个是什么东西呢?[/quote]
DEFUN_CMD_FUNC_TEXT这个宏使用的地方后面肯定跟有花括号的查找看看。
要不你像楼主说的编译个中间文件出来看一下宏展开后的中间代码就什么都明白了DEFUN(func_name1, cmd_name1, cmd_str1, help_str1)
{
return 1;
}
DEFUN(func_name2, cmd_name2, cmd_str2, help_str2)
{
return 2;
}
这两个宏展开之后变成这样:
static int func_name1 (struct cmd_element *, struct vty *, int, const char *[]);
struct cmd_element cmd_name1 = { .string = cmd_str1, .func = func_name1, .doc = help_str1, .attr = 0, .daemon = 0, };
static int func_name1 (struct cmd_element *self __attribute__ ((unused)), struct vty *vty __attribute__ ((unused)), int argc __attribute__ ((unused)), const char *argv[] __attribute__ ((unused)) )
{
return 1;
}
static int func_name2 (struct cmd_element *, struct vty *, int, const char *[]);
struct cmd_element cmd_name2 = { .string = cmd_str2, .func = func_name2, .doc = help_str2, .attr = 0, .daemon = 0, };
static int func_name2 (struct cmd_element *self __attribute__ ((unused)), struct vty *vty __attribute__ ((unused)), int argc __attribute__ ((unused)), const char *argv[] __attribute__ ((unused)) )
{
return 2;
}
/* helper defines for end-user DEFUN* macros */
#define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
struct cmd_element cmdname = \
{ \
.string = cmdstr, \
.func = funcname, \
.doc = helpstr, \
.attr = attrs, \
.daemon = dnum, \
};
#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 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)
宏后面不一定要跟分号的吧#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_CMD_FUNC_DECL是:
#define DEFUN_CMD_FUNC_DECL(funcname) \
static int funcname (struct cmd_element *, struct vty *, int, const char *[]);
而DEFUN_CMD_FUNC_TEXT是:
#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宏中的funcname参数实现定义函数名的,那么就应是两个函数名一样啊,为什么不是重定义呢
我明白你的意思是如果使用不同宏的时候不会重名,但是如果一个宏呢,不是会重名吗?
是不是因为__attribute__ ((unused))的关系,这个是什么东西呢?