lwip 有趣的陣列定義 預處理 轉

2021-05-27 07:03:04 字數 1950 閱讀 3108

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 

#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, y ) ( ((x) 

< (y)) ? (x) : (y) ) 

#ifdefine min 

(正確) 

#ifdefine min(x,y) 

(錯誤) 

unsigned char a=; 

lwip 有趣的陣列定義 預處理

alignment struct tcpinclude output 在全域性定義的巨集和在乙個函式內部定義的巨集有什麼不同?是不是和變數的定義含義差不多,作用域不同?還是有其他的什麼差別?巨集定義的作用域是同檔案內從定義開始起作用 直到取消定義 static u8 t memp memory me...

有趣的C語言預處理

分類解釋 在編譯器編譯之前,會首先搜尋預處理指令,按照指令完成編譯,預處理又分為 檔案包含 條件編譯 布局控制 雜注 和巨集替換。檔案包含 include 和 include 前者是和該c檔案相同目錄下的.h,如 include os cfg.h 或指明路徑的.h,如 include softwar...

C 的特殊預處理定義 和

c c 的預處理定義 一。stringizing operator 在c和c 中數字標誌符 被賦予了新的意義,即字串化操作符。其作用是 將巨集定義中的傳入引數名轉換成用一對雙引號括起來的 引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如 define example...