lwip--有趣的数组定义(预处理) ——转

来源:互联网 发布:关于来电软件 编辑:程序博客网 时间:2024/05/20 08:22
lwip--有趣的数组定义(预处理) ——转 

该数组存放TCPIP各个模块的内存缓存。 

每个不同模块又分解为多个包,每个包的尺寸相同。 

当接到到数据包之后,根据不同内存模式,将包分解存储到相应的模块缓存中,发送也一样。 

详见(low_level_input和low_level_output两个函数) 

static u8_t memp_memory[MEM_ALIGNMENT  
#define LWIP_MEMPOOL(name,num,size,desc) (num) (MEMP_SIZE MEMP_ALIGN_SIZE(size) 
#include "lwip/memp_std.h" 
]; 

memp_std.h文件中部分代码 

#if LWIP_RAW 
LWIP_MEMPOOL(RAW_PCB,        MEMP_NUM_RAW_PCB,         sizeof(struct raw_pcb),        "RAW_PCB") 
#endif  

#if LWIP_UDP 
LWIP_MEMPOOL(UDP_PCB,        MEMP_NUM_UDP_PCB,         sizeof(struct udp_pcb),        "UDP_PCB") 
#endif  

#if LWIP_TCP 
LWIP_MEMPOOL(TCP_PCB,        MEMP_NUM_TCP_PCB,         sizeof(struct tcp_pcb),        "TCP_PCB") 
LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN,  sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN") 
LWIP_MEMPOOL(TCP_SEG,        MEMP_NUM_TCP_SEG,         sizeof(struct tcp_seg),        "TCP_SEG") 
#endif  

#undef LWIP_MEMPOOL 

数组中的宏定义,可单独拿出来,与数组无关,因为用#define定义的宏是在预处理阶段进行处理的,而非编译时期进行 

预处理,后面的include也是预处理。可以根据前面进行展开。 

如果LWIP_RAW定义了 

memp_memory[[MEM_ALIGNMENT 1+ (MEMP_NUM_RAW_PCB) (MEMP_SIZE MEMP_ALIGN_SIZE(sizeof(struct raw_pcb)) )] 

如果LWIP_UDP定义了 

memp_memory[[MEM_ALIGNMENT 1+ (MEMP_NUM_UDP_PCB) (MEMP_SIZE MEMP_ALIGN_SIZE(sizeof(struct udp_pcb)) )] 

如果两者都定义了 

memp_memory[[MEM_ALIGNMENT 1+ (MEMP_NUM_RAW_PCB) (MEMP_SIZE MEMP_ALIGN_SIZE(sizeof(struct raw_pcb)) (MEMP_NUM_UDP_PCB) (MEMP_SIZE MEMP_ALIGN_SIZE(sizeof(struct udp_pcb)) )] 

说明这个数组是可变的,根据你是否定义LWIP_RAW等宏(这些宏实际可看做TCPIP的各个模块,根据需要选择) 

#define  MIN( x, ((x) (y)) (x) (y)  

  

#ifdefine MIN   (正确) 

  

#ifdefine MIN(x,y)   (错误) 



unsigned char a[]={ 
#define pi 3.14                 //这个可以宏可以看做与数组无关 
1,2,3,4 
}; 



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zyboy2000/archive/2009/06/29/4305816.aspx
原创粉丝点击