c語言函數宏的幾種封裝方式
時間:2023-11-01 來源:華清遠見
c語言函數宏的幾種封裝方式
在c語言開發中,出了使用函數封裝代碼之外,也經常使用宏來封裝一些重要或簡潔的代碼。
宏在c開發有三種:預定義宏,不帶參宏,和帶參數宏,通常,帶參數宏也叫函數宏,函數宏,即包含多條語句的宏定義,其通常為某一被頻繁調用的功能的語句封裝,且不想通過函數方式封裝來降低額外的彈棧壓棧開銷,在實際項目開發中,函數宏的作用很強大,下面介紹三種常用的三種封裝方式:
第一種:{} 方式
比如:

此時如果在非控制語句中調用,則可以正常編譯通過,如下:

但當在控制語句中調用時,比如分支語句if(else if、else 等)如:

編譯器會報錯,如下:

上面的語句展開為:

SWAP(x, y); 后面的 ; 使得 if 的作用域終結了,后續的 else 當然沒有找到與之匹配的 if 了。宏函數應該適用于任何語法。
這種函數宏的優缺點:
優點:簡單粗暴。
缺點:不能在無花括號且有分支的 if 語句中直接調用;能夠不帶 ; 直接調用。
第二種 do{...}while(0) 方式

do{...}while(0) 為控制流語句,是一條復合語句,在語句塊中可以添加參數檢測。例如:

編譯器會把 do{...}while(0); 認為為一條語句。因此,do{...}while(0) 方式的函數宏可以在無花括號且有分支的 if 語句中直接調用。例如:

這種函數宏的優缺點:
優點:支持在無花括號且有分支的 if 語句中直接調用;支持提前退出函數宏;強制調用時必須使用 ;。
缺點:無返回值,不能作為表達式的右值使用。
第三種 ({}) 方式
({}) 為 GNU C 擴展的語法,非 C 語言的原生語法,封裝后形態如下:

({}) 既可以用于分支語句中,也可以作為右值,例如:

這種函數宏的優缺點:
優點:支持在無花括號且有分支的 if 語句中直接調用;有返回值,支持作為表達式的右值。
缺點:不支持提前退出函數宏;非 C 的原生語法,編譯器可能不支持。
總結
綜上,在 {}、do{...}while(0) 和 ({}) 這三種函數宏的封裝方式之中,應盡可能不使用 {},考慮兼容性一般選擇使用 do{...}while(0),當需要函數宏返回時可以考慮使用 ({}) 或直接定義函數。

