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是多個值的和。
最後要說的就是,這種寫法太古怪,大家還是儘量規範程式設計吧。