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

1474阅读 0评论2012-03-04 suanmeilizhi
分类:

Linux2.4协议栈相关的一个文件:net\ipv4\protocol.c。

利用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;

上一篇:Shell脚本调试技术
下一篇:include<>和include"'的区别