1. 程式人生 > >memp_get_memorysize中的define用法問題

memp_get_memorysize中的define用法問題

正點原子阿波羅開發板,STM32F767晶片,實驗61 網路通訊實驗,\lwip-1.4.1\src\core\memp.c中加入了一個介面函式memp_get_memorysize,引用如下:

//得到memp_memory陣列大小

u32_t memp_get_memorysize(void) {     u32_t length=0;     length=(             MEM_ALIGNMENT-1 //全域性型陣列 為所有POOL分配的記憶體空間             //MEMP_SIZE表示需要在每個POOL頭部預留的空間  MEMP_SIZE = 0             #define LWIP_MEMPOOL(name,num,size,desc)+((num)*(MEMP_SIZE+MEMP_ALIGN_SIZE(size)))             #include "lwip/memp_std.h"             );     return length; }

 其中對length賦值的語句,其用法特別奇怪,這麼多年沒見過這種寫法,因此這裡記錄並分享一下。

現解釋如下:

其中的語句

#define LWIP_MEMPOOL(name,num,size,desc)+((num)*(MEMP_SIZE+MEMP_ALIGN_SIZE(size)))

 等價於

#define LWIP_MEMPOOL(name,num,size,desc)       +((num)*(MEMP_SIZE+MEMP_ALIGN_SIZE(size)))

 也就是說,巨集定義define,看到又括號時,後面就認為是定義的具體內容,有沒有空格都行。為了驗證,寫了測試函式如下:

int main(void) {           unsigned char ucIndex = 1;    

    ucIndex = (

        3         #define ADD(x)+x         ADD(8)         );     printf("ucIndex:%d\r\n", ucIndex);     return 0; }

 執行結果為

ucIndex:11

因此語法沒問題,後面用#include包含的檔案中,全部使用了前面定義的巨集LWIP_MEMPOOL,因此相當於length是多個值的和。

最後要說的就是,這種寫法太古怪,大家還是儘量規範程式設計吧。