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...