读书人

enum 中施用 #define

发布时间: 2013-01-19 11:41:36 作者: rapoo

enum 中使用 #define
这是在 lwip 中的一段代码,看了之后虽然有些猜测,但总觉得不太对,所以发上来求高人指点一下。
这个写法到底是什么意思?

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"
)
}

[解决办法]
定义的宏是为了 后面的#include做准备。
控制#include引入的代码的内容
[解决办法]
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。

[解决办法]
这个是LWIP里面的代码. LWIP的作者通过这种复杂的方式达到一种配置的目的.
在数组/枚举定义里面用#define和#include语句这种用法很少见. 不过是可以通过编译,肯定也是正确的.

我们在理解上就把#include的文件原地打开即可.#define语句不影响语法.

使用lwip的时候,要自己建立一个lwippools.h文件
然后在里面配置内存POOL,如下:
LWIP_MALLOC_MEMPOOL_START
LWIP_MALLOC_MEMPOOL(20, 256)
LWIP_MALLOC_MEMPOOL(10, 512)
LWIP_MALLOC_MEMPOOL(5, 1512)
LWIP_MALLOC_MEMPOOL_END
表示为动态内存堆相关功能函数分配 20 个 256 字节
长度的内存块,10 个 512 字节的内存块,5 个 1512 字节的内存块。

楼主的代码具体地来说.首先,这是定义一个枚举,包含了两个枚举item: MEMP_POOL_HELPER_START 和 MEMP_POOL_HELPER_LAST
而这两个枚举item的值是不确定的,是根据用户在lwippools.h的配置而不同的.
MEMP_POOL_HELPER_START表示256的那块内存,MEMP_POOL_HELPER_LAST表示1512的那块内存.

读书人网 >C语言

热点推荐