利用C语言预处理器形成链表

2013-01-01 14:57:49 · 作者: · 浏览: 383

  利用C语言预处理器的顺序Parse特性形成了一个链表。

  技巧都在IPPROTO_PREVIOUS 宏,引用#define以及#undefine,形成一个链表赋值给inet_protocol_base .

  #define IPPROTO_PREVIOUS NULL

  #ifdef CONFIG_IP_MULTICAST

  static struct inet_protocol igmp_protocol =

  {

  igmp_rcv,        /* IGMP handler        */

  NULL,            /* IGMP error control    */

  IPPROTO_PREVIOUS,    /* next            */

  IPPROTO_IGMP,        /* protocol ID        */

  0,            /* copy            */

  NULL,            /* data            */

  "IGMP"            /* name            */

  };

  #undef  IPPROTO_PREVIOUS

  #define IPPROTO_PREVIOUS &igmp_protocol

  #endif

  static struct inet_protocol tcp_protocol =

  {

  tcp_v4_rcv,        /* TCP handler        */

  tcp_v4_err,        /* TCP error control    */

  IPPROTO_PREVIOUS,

  IPPROTO_TCP,        /* protocol ID        */

  0,            /* copy            */

  NULL,            /* data            */

  "TCP"            /* name            */

  };

  #undef  IPPROTO_PREVIOUS

  #define IPPROTO_PREVIOUS &tcp_protocol

  static struct inet_protocol udp_protocol =

  {

  udp_rcv,        /* UDP handler        */

  udp_err,        /* UDP error control    */

  IPPROTO_PREVIOUS,    /* next            */

  IPPROTO_UDP,        /* protocol ID        */

  0,            /* copy            */

  NULL,            /* data            */

  "UDP"            /* name            */

  };

  #undef  IPPROTO_PREVIOUS

  #define IPPROTO_PREVIOUS &udp_protocol

  static struct inet_protocol icmp_protocol =

  {

  icmp_rcv,        /* ICMP handler        */

  NULL,            /* ICMP error control    */

  IPPROTO_PREVIOUS,    /* next            */

  IPPROTO_ICMP,        /* protocol ID        */

  0,            /* copy            */

  NULL,            /* data            */

  "ICMP"            /* name            */

  };

  #undef  IPPROTO_PREVIOUS

  #define IPPROTO_PREVIOUS &icmp_protocol

  struct inet_protocol *inet_protocol_base = IPPROTO_PREVIOUS;