eworker 发表于 2010-8-9 10:49:36

在数组初始化中包含宏定义,哪位大侠能解释下原理?多谢

const u16_t memp_sizes = {
#define LWIP_MEMPOOL(name,num,size,desc)MEMP_ALIGN_SIZE(size),
#include "../include/lwip/memp_std.h"
};

typedef enum {
    /* Get the first (via:
      MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/
    MEMP_POOL_HELPER_FIRST = ((u8_t)
#define LWIP_MEMPOOL(name,num,size,desc)
#define LWIP_MALLOC_MEMPOOL_START 1
#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0
#define LWIP_MALLOC_MEMPOOL_END
#include "lwip/memp_std.h"
    ) ,
    /* Get the last (via:
      MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */
    MEMP_POOL_HELPER_LAST = ((u8_t)
#define LWIP_MEMPOOL(name,num,size,desc)
#define LWIP_MALLOC_MEMPOOL_START
#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size *
#define LWIP_MALLOC_MEMPOOL_END 1
#include "lwip/memp_std.h"
    )
} memp_pool_helper_t;

eworker 发表于 2010-8-9 11:20:50

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

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

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

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

详见(low_level_input和low_level_output两个函数)

static u8_t memp_memory[MEM_ALIGNMENT - 1
#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 /* LWIP_RAW */

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

#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 /* LWIP_TCP */

#undef LWIP_MEMPOOL

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

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

如果LWIP_RAW定义了

memp_memory[

如果LWIP_UDP定义了

memp_memory[

如果两者都定义了

memp_memory[

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

#defineMIN( x, y ) ( ((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
页: [1]
查看完整版本: 在数组初始化中包含宏定义,哪位大侠能解释下原理?多谢