user-0 提问: 宏定义函数求解

回复:
user: user-0
content: 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; }   擦，展开来看了半天才发现一个是声明一个是实现啊。 谢谢了！

user: user-1
content: 引用 6 楼 lk0098 的回复:[quote=引用 3 楼 wanght99 的回复:] 这里的宏是带参数的 #define DEFUN_CMD_FUNC_DECL(func1) 会声明一个func1, #define DEFUN_CMD_FUNC_DECL(func2)会声明一个func2, 互相不影响  两个函数不是同名吗，这样没有影响？[/quote]  两个不是同名的, 函数名取决于使用宏的时候传给它的名字, 我上面的例子里一个是func1, 一个是func2, 可以理解为一种参数传递

user: user-2
content: 引用 8 楼 lk0098 的回复:[quote=引用 7 楼 brookmill 的回复:] 举个例子吧： 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; }   谢谢你的回答。应该是这样：首先执行的宏： #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这个宏使用的地方后面肯定跟有花括号的查找看看。  要不你像楼主说的编译个中间文件出来看一下宏展开后的中间代码就什么都明白了

user: user-3
content: 举个例子吧： 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; }

user: user-0
content: 引用 3 楼 wanght99 的回复:这里的宏是带参数的 #define DEFUN_CMD_FUNC_DECL(func1) 会声明一个func1, #define DEFUN_CMD_FUNC_DECL(func2)会声明一个func2, 互相不影响  两个函数不是同名吗，这样没有影响？

user: user-0
content: 引用 2 楼 brookmill 的回复:比较一下DEFUN_CMD_FUNC_TEXT 和 DEFUN_CMD_FUNC_DECL 就会发现除了 __attribute__ 之外，返回值和参数列表都是一样的。 DEFUN_CMD_FUNC_DECL后面有分号，所以是声明(DECLare） DEFUN_CMD_FUNC_TEXT后面没有分号，所以紧接着下面一定是有函数体{ ... }  还真没有实现.....他整个结构如下：/* 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) 宏后面不一定要跟分号的吧

user: user-0
content: 引用 1 楼 brookmill 的回复:DEFUN_CMD_FUNC_TEXT 就是实现 DEFUN_CMD_FUNC_DECL 就是声明 两个都是声明啊，都是一堆参数，哪里有运算实现啊?求解，谢谢

user: user-1
content: 这里的宏是带参数的 #define DEFUN_CMD_FUNC_DECL(func1) 会声明一个func1, #define DEFUN_CMD_FUNC_DECL(func2)会声明一个func2, 互相不影响

user: user-4
content: 引用 9 楼 zhao4zhong1 的回复:编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E+1

user: user-5
content: 引用 3 楼 wanght99 的回复:这里的宏是带参数的 #define DEFUN_CMD_FUNC_DECL(func1) 会声明一个func1, #define DEFUN_CMD_FUNC_DECL(func2)会声明一个func2, 互相不影响  ++

user: user-6
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-0
content: 引用 7 楼 brookmill 的回复:举个例子吧： 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; }   谢谢你的回答。应该是这样：首先执行的宏： #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))的关系，这个是什么东西呢？

user: user-3
content: 比较一下DEFUN_CMD_FUNC_TEXT 和 DEFUN_CMD_FUNC_DECL 就会发现除了 __attribute__ 之外，返回值和参数列表都是一样的。 DEFUN_CMD_FUNC_DECL后面有分号，所以是声明(DECLare） DEFUN_CMD_FUNC_TEXT后面没有分号，所以紧接着下面一定是有函数体{ ... }

user: user-3
content: DEFUN_CMD_FUNC_TEXT 就是实现 DEFUN_CMD_FUNC_DECL 就是声明