LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 881|回复: 4

请大家帮忙看下这个结构体!

[复制链接]
发表于 2006-12-12 18:01:56 | 显示全部楼层 |阅读模式
有结构体声明如下:
  1. typedef struct NGifnet_S {
  2.     struct NGifnet_S   *if_next;    /* link */
  3.    #define NG_IFT_OTHER        0      
  4. #define NG_IFT_ETHER        1       /* ethernet */
  5. #define NG_IFT_LOOP         2       /* loopback */
  6. #define NG_IFT_PPP          3       /* ppp */
  7. #define NG_IFT_SLIP         4       /* slip */
  8. #define NG_IFT_AUTOSTART    0x8000  /* used only at init time */
  9.     int                 if_flags;   /* flags */
  10. [color=blue#define NG_IFF_UP           0x0001  /* interface is up */
  11. #define NG_IFF_BROADCAST    0x0002  /* broadcast address valid */
  12. #define NG_IFF_DEBUG        0x0004  /* turn on debugging */
  13. #define NG_IFF_LOOPBACK     0x0008  /* is a loopback net */
  14. #define NG_IFF_POINTOPOINT  0x0010  /* interface is point-to-point link */
  15. #define NG_IFF_EXTNAT       0x0020  /* external NAT interface */
  16. #define NG_IFF_RUNNING      0x0040  /* resources allocated */
  17. #define NG_IFF_NOARP        0x0080  /* no address resolution protocol */
  18. #define NG_IFF_PROMISC      0x0100  /* receive all packets */
  19. #define NG_IFF_ALLMULTI     0x0200  /* receive all multicast packets */
  20. #define NG_IFF_OACTIVE      0x0400  /* transmission in progress */
  21. #define NG_IFF_SIMPLEX      0x0800  /* can't hear own transmissions */
  22. #define NG_IFF_MULTICAST    0x8000  /* supports multicast */][/color]
  23. /* flags set internally only: */
  24. #define NG_IFF_CANTCHANGE \
  25.     (NG_IFF_BROADCAST|NG_IFF_LOOPBACK|NG_IFF_POINTOPOINT|NG_IFF_RUNNING|\
  26.       NG_IFF_PROMISC|NG_IFF_ALLMULTI|NG_IFF_OACTIVE|NG_IFF_SIMPLEX|NG_IFF_MULTICAST)
  27. /* address */
  28.     NGuint              if_addr;           
  29.     NGuint              if_dstaddr;      
  30.     NGuint              if_net;            
  31.     NGuint              if_netmask;         
  32.     NGuint              if_subnet;         
  33.     NGuint              if_subnetmask;     
  34.     NGuint              if_netbroadcast;   
  35.     NGuint              if_broadaddr;      
  36.     struct NGinmulti_S *if_multiaddrs;      
  37.     char               *if_drvname;        
  38.     int                 if_mtu;            
  39.     u_long              if_bps;            
  40.     NGqueue             if_outq;            
  41. /* driver functions */
  42.     int               (*if_open_f)( struct NGifnet_S *ifnetp);
  43.     int               (*if_close_f)( struct NGifnet_S *ifnetp);
  44.     int               (*if_output_f)( struct NGifnet_S *ifnetp, NGbuf *bufp, NGuint dst_addr);
  45.     void              (*if_start_f)( struct NGifnet_S *ifnetp);
  46.     int               (*if_cntl_f)( struct NGifnet_S *ifnetp, int cmd, int option, void *arg);
  47.     void              (*if_setmulti_f)( struct NGifnet_S *ifnetp);
  48. /* statistics */
  49.     u_long              if_ibytes;
  50.     u_long              if_ierrors;
  51.     u_long              if_imcasts;
  52.     u_long              if_ipackets;
  53.     u_long              if_iqdrops;
  54.     u_long              if_noproto;
  55.     u_long              if_obytes;
  56.     u_long              if_oerrors;
  57.     u_long              if_omcasts;
  58.     u_long              if_opackets;
  59.     u_long              if_oqdrops;
  60.     NGnode              if_buflist;   
  61.     int                 if_dev1;        
  62.     int                 if_dev2;        
  63.     void               *if_devptr1;     
  64.     void               *if_devptr2;     
  65. } NGifnet
复制代码

结构体里面使用了宏定义,该怎么引用该宏?
另外哪里有详细点介绍结构体里面使用宏的文章?

谢谢大家!!
 楼主| 发表于 2006-12-12 18:07:33 | 显示全部楼层
蓝色字体的:
  1. typedef struct NGifnet_S {
  2.     struct NGifnet_S   *if_next;    /* link */
  3.    #define NG_IFT_OTHER        0      
  4. #define NG_IFT_ETHER        1       /* ethernet */
  5. #define NG_IFT_LOOP         2       /* loopback */
  6. #define NG_IFT_PPP          3       /* ppp */
  7. #define NG_IFT_SLIP         4       /* slip */
  8. #define NG_IFT_AUTOSTART    0x8000  /* used only at init time */
  9.     int                 if_flags;   /* flags */
  10. [color=blue]#define NG_IFF_UP           0x0001  /* interface is up */
  11. #define NG_IFF_BROADCAST    0x0002  /* broadcast address valid */
  12. #define NG_IFF_DEBUG        0x0004  /* turn on debugging */
  13. #define NG_IFF_LOOPBACK     0x0008  /* is a loopback net */
  14. #define NG_IFF_POINTOPOINT  0x0010  /* interface is point-to-point link */
  15. #define NG_IFF_EXTNAT       0x0020  /* external NAT interface */
  16. #define NG_IFF_RUNNING      0x0040  /* resources allocated */
  17. #define NG_IFF_NOARP        0x0080  /* no address resolution protocol */
  18. #define NG_IFF_PROMISC      0x0100  /* receive all packets */
  19. #define NG_IFF_ALLMULTI     0x0200  /* receive all multicast packets */
  20. #define NG_IFF_OACTIVE      0x0400  /* transmission in progress */
  21. #define NG_IFF_SIMPLEX      0x0800  /* can't hear own transmissions */
  22. #define NG_IFF_MULTICAST    0x8000  /* supports multicast */][/color]
  23. /* flags set internally only: */
  24. #define NG_IFF_CANTCHANGE \
  25.     (NG_IFF_BROADCAST|NG_IFF_LOOPBACK|NG_IFF_POINTOPOINT|NG_IFF_RUNNING|\
  26.       NG_IFF_PROMISC|NG_IFF_ALLMULTI|NG_IFF_OACTIVE|NG_IFF_SIMPLEX|NG_IFF_MULTICAST)
  27. /* address */
  28.     NGuint              if_addr;           
  29.     NGuint              if_dstaddr;      
  30.     NGuint              if_net;            
  31.     NGuint              if_netmask;         
  32.     NGuint              if_subnet;         
  33.     NGuint              if_subnetmask;     
  34.     NGuint              if_netbroadcast;   
  35.     NGuint              if_broadaddr;      
  36.     struct NGinmulti_S *if_multiaddrs;      
  37.     char               *if_drvname;        
  38.     int                 if_mtu;            
  39.     u_long              if_bps;            
  40.     NGqueue             if_outq;            
  41. /* driver functions */
  42.     int               (*if_open_f)( struct NGifnet_S *ifnetp);
  43.     int               (*if_close_f)( struct NGifnet_S *ifnetp);
  44.     int               (*if_output_f)( struct NGifnet_S *ifnetp, NGbuf *bufp, NGuint dst_addr);
  45.     void              (*if_start_f)( struct NGifnet_S *ifnetp);
  46.     int               (*if_cntl_f)( struct NGifnet_S *ifnetp, int cmd, int option, void *arg);
  47.     void              (*if_setmulti_f)( struct NGifnet_S *ifnetp);
  48. /* statistics */
  49.     u_long              if_ibytes;
  50.     u_long              if_ierrors;
  51.     u_long              if_imcasts;
  52.     u_long              if_ipackets;
  53.     u_long              if_iqdrops;
  54.     u_long              if_noproto;
  55.     u_long              if_obytes;
  56.     u_long              if_oerrors;
  57.     u_long              if_omcasts;
  58.     u_long              if_opackets;
  59.     u_long              if_oqdrops;
  60.     NGnode              if_buflist;   
  61.     int                 if_dev1;        
  62.     int                 if_dev2;        
  63.     void               *if_devptr1;     
  64.     void               *if_devptr2;     
  65. } NGifnet
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-12 19:40:57 | 显示全部楼层
试了一下,直接引用就可以了
  1. $ cat a.c
  2. #include <stdio.h>
  3. struct A
  4. {
  5.         int a;
  6. #define A_a1 1
  7. #define A_a2 2
  8. };
  9. int main()
  10. {
  11.         struct A a;
  12.         a.a = A_a2;
  13.         printf("%d\n", a.a);
  14.         return 0;
  15. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-12 21:41:38 | 显示全部楼层
结构体中的 #define 毕竟还是 #define,所以该怎么用就怎么用--除非在某个地方被 #undef 了,不过这种用法在函数中使得多一点,起子程序的作用。
回复 支持 反对

使用道具 举报

发表于 2006-12-13 11:39:33 | 显示全部楼层
#define在结构体内外是一样用的
放在结构体内只是表明他是为了哪个定义的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表