日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

C/C++語言宏定義函數封裝小妙招!

來源: 責編: 時間:2024-01-22 08:43:06 289觀看
導讀宏函數是一種在編程語言中定義的宏,用于在源代碼中進行文本替換。宏函數可以在編譯時展開,將宏的調用處替換為宏函數定義中的文本。宏函數的定義通常以#define關鍵字開始,后面跟著宏的名稱和宏的替換文本。宏函數的定義

宏函數是一種在編程語言中定義的宏,用于在源代碼中進行文本替換。宏函數可以在編譯時展開,將宏的調用處替換為宏函數定義中的文本。宏函數的定義通常以#define關鍵字開始,后面跟著宏的名稱和宏的替換文本。5Wy28資訊網——每日最新資訊28at.com

宏函數的定義可以包含參數,在宏的替換文本中使用這些參數來生成具體的代碼。宏函數的參數在宏調用時被傳遞,并在宏替換時被展開。5Wy28資訊網——每日最新資訊28at.com

5Wy28資訊網——每日最新資訊28at.com

1. 函數宏介紹

函數宏,即包含多條語句的宏定義,其通常為某一被頻繁調用的功能的語句封裝,且不想通過函數方式封裝來降低額外的彈棧壓棧開銷。5Wy28資訊網——每日最新資訊28at.com

函數宏本質上為宏,可以直接進行定義,例如:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b) /    int tmp = a;    /    a = b;          /    b = tmp

但上述的宏具有一個明顯的缺點:當遇到 if、while 等語句且不使用花括號僅調用宏時,實際作用范圍在宏的第一個分號后便結束。即 a = b 和 b = tmp 均不受控制語句所作用。5Wy28資訊網——每日最新資訊28at.com

因此,在工程中,一般使用三種方式來對函數宏進行封裝,分別為 {}、do{...}while(0) 和 ({})。下文將一一對三種方式進行分析,比較各自的優劣點。5Wy28資訊網——每日最新資訊28at.com

2. {} 方式

INT_SWAP 宏使用 {} 封裝后形態如下:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b)/{                   /    int tmp = a;    /    a = b;          /    b = tmp;        /}

此時,直接調用與在無花括號的控制語句(如 if、while)中調用均能正常運行,例如:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b) /{                   /    int tmp = a;    /    a = b;          /    b = tmp;        /}int main(){ int var_a = 1; int var_b = 2; INT_SWAP(var_a, var_b); printf("var_a = %d, var_b = %d/n", var_a, var_b);   // var_a = 2, var_b = 1  if (1)    INT_SWAP(var_a, var_b); printf("var_a = %d, var_b = %d/n", var_a, var_b);   // var_a = 1, var_b = 2}

但當無花括號的 if 語句存在其他分支(else if、else 等)如:5Wy28資訊網——每日最新資訊28at.com

if (1)   INT_SWAP(var_a, var_b);else printf("hello world!/n");

會發現編譯出錯:5Wy28資訊網——每日最新資訊28at.com

.../mnt/hgfs/share/pr_c/src/main.c: In function ‘main’:/mnt/hgfs/share/pr_c/src/main.c:18:2: error: ‘else’ without a previous ‘if’  else

這是因為 INT_SWAP(var_a, var_b); 最后的 ; 已經把 if 的作用域終結了,后續的 else 當然沒有找到與之匹配的 if 了。5Wy28資訊網——每日最新資訊28at.com

因此,解決方法有兩種,分別為不使用 ;(port.1)或規定必須使用帶花括號的 if(port.2),例如:5Wy28資訊網——每日最新資訊28at.com

/* port.1 */if (1)   INT_SWAP(var_a, var_b)else{    printf("hello world!/n");}/* port.2 */if (1){   INT_SWAP(var_a, var_b);}else{    printf("hello world!/n");}

可見,不使用 ; 的調用方式無論從程序閱讀還是使用方法方面都是十分別扭的;而規定必須使用帶花括號的 if 的調用方式有違常理的,因為宏函數應該適用于任何語法。5Wy28資訊網——每日最新資訊28at.com

優缺點總結:5Wy28資訊網——每日最新資訊28at.com

  • 優點:簡單粗暴。
  • 缺點:不能在無花括號且有分支的 if 語句中直接調用;能夠不帶 ; 直接調用。

3. do{...}while(0) 方式

INT_SWAP 宏使用 do{...}while(0) 封裝后形態如下:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b)   /do{                     /    int tmp = a;        /    a = b;              /    b = tmp;            /}while(0)

do{...}while(0) 表示只執行一遍 {} 內的語句,表象來說與 {} 的功能是一致的。不同的是,do{...}while(0) 可以提前退出函數宏、整合為一條語句與強制調用時必須使用 ;。5Wy28資訊網——每日最新資訊28at.com

由于 do{...}while(0) 實際為 while 循環,因此可以使用關鍵字 break 提前結束循環。利用該特性,可以為函數宏添加參數檢測。例如:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b)  /do{                 / if (a < 0 || b < 0) /  break;   /    int tmp = a;     /    a = b;           /    b = tmp;         /}while(0)

由于 do{...}while(0); 實際為一種語法,編譯器會把 do{...}while(0); 認為為一條語句。因此,do{...}while(0) 方式的函數宏可以在無花括號且有分支的 if 語句中直接調用。例如:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b)  /do{                 / if (a < 0 || b < 0) /  break;   /    int tmp = a;     /    a = b;           /    b = tmp;         /}while(0)int main(){ int var_a = 1; int var_b = 2; if (1)    INT_SWAP(var_a, var_b); else  printf("hello world!/n");  printf("var_a = %d, var_b = %d/n", var_a, var_b); // var_a = 2, var_b = 1 return 0;}

C 語言規定,do{...}while(0) 語法必須使用 ; 作為語句結尾。因此不可能存在以下語句的程序出現:5Wy28資訊網——每日最新資訊28at.com

if (1)   INT_SWAP(var_a, var_b)else{ printf("hello world!/n"); }

優缺點總結:5Wy28資訊網——每日最新資訊28at.com

  • 優點:支持在無花括號且有分支的 if 語句中直接調用;支持提前退出函數宏;強制調用時必須使用 ;。
  • 缺點:無返回值,不能作為表達式的右值使用。

4. ({}) 方式

({}) 為 GNU C 擴展的語法,非 C 語言的原生語法。5Wy28資訊網——每日最新資訊28at.com

INT_SWAP 宏使用 ({}) 封裝后形態如下:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b)   /({                      /    int tmp = a;        /    a = b;              /    b = tmp;            /})

與 do{...}while(0) 相同,({}) 支持在無花括號且有分支的 if 語句中直接調用。例如:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b)  /({                 / int tmp = a;    / a = b;          / b = tmp;        /})int main(){ int var_a = 1; int var_b = 2;  if (1)    INT_SWAP(var_a, var_b); else  printf("hello world!/n"); printf("var_a = %d, var_b = %d/n", var_a, var_b); // var_a = 2, var_b = 1  return 0;}

與 do{...}while(0) 不同的是,({}) 不能提前退出函數宏與支持返回值。({}) 畢竟不是 while 循環,不能直接使用 break退出函數宏是比較容易理解。那支持返回值是什么意思呢?5Wy28資訊網——每日最新資訊28at.com

答案是 C 語言規定 ({}) 中的最后一條語句的結果為該雙括號體的返回值。例如:5Wy28資訊網——每日最新資訊28at.com

int main(){ int a = ({  10;  1000; }); printf("a = %d/n", a);      // a = 1000}

因此,({}) 可以為函數宏提供返回值。例如:5Wy28資訊網——每日最新資訊28at.com

#define INT_SWAP(a,b)  /({                 / int ret = 0;  / if (a < 0 || b < 0) / {     /  ret = -1;  / }     / else    / {     /  int tmp = a;    /  a = b;          /  b = tmp;        / }     / ret;    /})int main(){ int var_a = 1; int var_b = 2;  if (INT_SWAP(var_a, var_b) != -1)  printf("swap success !!/n");     // swap success !! else  printf("swap fail !!/n");  printf("var_a = %d, var_b = %d/n", var_a, var_b); // var_a = 2, var_b = 1  return 0;}

可見,此時的 INT_SWAP 宏已與函數十分接近。5Wy28資訊網——每日最新資訊28at.com

優缺點總結:5Wy28資訊網——每日最新資訊28at.com

  • 優點:支持在無花括號且有分支的 if 語句中直接調用;有返回值,支持作為表達式的右值。
  • 缺點:不支持提前退出函數宏;非 C 的原生語法,編譯器可能不支持。

5. 總結

綜上,在 {}、do{...}while(0) 和 ({}) 這三種函數宏的封裝方式之中,應盡可能不使用 {},考慮兼容性一般選擇使用 do{...}while(0),當需要函數宏返回時可以考慮使用 ({}) 或直接定義函數。5Wy28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-65875-0.htmlC/C++語言宏定義函數封裝小妙招!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C++泛型編程:解鎖代碼靈活性的奧秘

下一篇: 提升 Go 編程:Go 1.22 中有哪些新特性?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲视频精品| 国产视频久久网| 久久噜噜噜精品国产亚洲综合| 亚欧美中日韩视频| 久久免费高清| 欧美另类高清视频在线| 国产精品视频xxx| 激情综合色综合久久综合| 亚洲国产一区在线| 亚洲一区二区三区四区五区午夜 | 一区二区三区欧美视频| 欧美亚洲综合另类| 你懂的视频欧美| 国产精品久久久久久久久久ktv| 国产亚洲一区二区在线观看 | 日韩视频中午一区| 欧美亚洲免费| 欧美成人一区二区三区| 国产精品久久一区主播| 一区二区三区在线免费观看| 99在线|亚洲一区二区| 久久国产精品网站| 欧美日韩精品免费观看视一区二区 | 久久久视频精品| 欧美日韩人人澡狠狠躁视频| 国产在线视频不卡二| 99国产精品久久久久久久久久| 欧美在线观看www| 欧美日本韩国一区二区三区| 国内精品国语自产拍在线观看| 一区二区三区高清| 美女任你摸久久| 国产伦精品一区二区三| 亚洲品质自拍| 久久九九精品99国产精品| 欧美性做爰毛片| 亚洲国产成人久久| 久久国产精品99久久久久久老狼| 欧美视频第二页| 亚洲欧洲另类国产综合| 久久精品亚洲国产奇米99| 国产精品久久久久久久久久免费| 亚洲国产专区| 久久精品夜色噜噜亚洲aⅴ| 欧美性视频网站| 亚洲精品字幕| 免费不卡视频| 国产综合色产在线精品| 亚洲欧美精品在线观看| 欧美日韩国产成人在线| 亚洲国产日韩在线| 久久久久久网站| 国产视频一区在线观看一区免费| 一区二区三区日韩在线观看| 欧美精品91| 亚洲国产99精品国自产| 久久天堂国产精品| 国内精品久久久久影院优| 欧美在线不卡| 国产精品制服诱惑| 亚洲综合第一页| 欧美日韩在线一区| 99re成人精品视频| 欧美激情亚洲激情| 亚洲精品日韩激情在线电影| 免费一区视频| 亚洲国产成人精品视频| 免费人成精品欧美精品| 在线看欧美视频| 老色鬼精品视频在线观看播放| 国内精品视频在线播放| 久久久www成人免费精品| 国产一区二区三区在线观看精品| 午夜精品av| 国产美女精品人人做人人爽| 亚洲欧美中文日韩在线| 国产精品色网| 性欧美大战久久久久久久免费观看| 国产精品久久久久秋霞鲁丝| 亚洲女同精品视频| 国产精品一区二区女厕厕| 亚洲女同在线| 国产精品日韩精品| 午夜欧美电影在线观看| 国产日产欧产精品推荐色| 性欧美超级视频| 国产一区二区成人| 久久免费精品视频| 亚洲第一偷拍| 欧美精品一区在线播放| 一本色道婷婷久久欧美| 欧美性片在线观看| 午夜久久影院| 国产一区二区三区视频在线观看| 国产精品午夜久久| 亚洲一区二区三区影院| 国产精品视频1区| 久久av一区二区三区| 黑人操亚洲美女惩罚| 免费国产一区二区| 亚洲区在线播放| 欧美体内she精视频| 午夜精品久久久久久99热软件| 国产视频精品xxxx| 美女网站在线免费欧美精品| 亚洲日本理论电影| 欧美性jizz18性欧美| 欧美一级夜夜爽| 在线成人中文字幕| 欧美精品一区二区三区高清aⅴ| 日韩视频不卡| 国产精品网曝门| 久久综合一区| av不卡在线观看| 国产精品永久免费在线| 久久夜色精品国产亚洲aⅴ| 亚洲免费观看高清完整版在线观看| 欧美系列电影免费观看| 欧美在线你懂的| 最新日韩av| 国产精品综合视频| 你懂的网址国产 欧美| 亚洲桃色在线一区| 韩国视频理论视频久久| 欧美日韩国产色视频| 欧美一区二区视频免费观看| 亚洲国产欧美在线人成| 国产精品久久久久久久7电影| 久久久久久久高潮| av成人毛片| 国内综合精品午夜久久资源| 欧美精品亚洲二区| 久久黄金**| av成人免费观看| 狠狠爱成人网| 欧美性猛片xxxx免费看久爱 | 国产精品国产自产拍高清av| 久久三级福利| 亚洲一区二区三区高清| 在线国产欧美| 国产精品永久| 欧美日韩国产欧美日美国产精品| 欧美在线电影| 亚洲国产精品高清久久久| 欧美日韩中文精品| 久久综合色8888| 西瓜成人精品人成网站| 日韩视频中文字幕| 激情综合亚洲| 国产精品少妇自拍| 欧美理论视频| 久久综合网hezyo| 午夜精品久久久久久久男人的天堂| 亚洲黄色性网站| 国产一区在线免费观看| 欧美天堂亚洲电影院在线观看 | 久久综合中文字幕| 香蕉精品999视频一区二区| 亚洲美女视频在线观看| 经典三级久久| 国产日本精品| 国产精品久久久久91| 欧美激情一区二区三级高清视频| 久久精品综合网| 亚洲欧美国产另类| 99视频日韩| 亚洲精品乱码久久久久久日本蜜臀| 狠狠色2019综合网| 国产日韩av在线播放| 国产精品久久网| 欧美三日本三级三级在线播放| 麻豆成人精品| 久久久久久久精| 久久国产精品色婷婷| 欧美亚洲免费在线| 亚洲欧美国产77777| 中日韩午夜理伦电影免费| 亚洲精品中文在线| 亚洲国产老妈| 影音先锋一区| 伊人成人在线视频| 国产在线精品一区二区夜色| 国产精品永久免费观看| 国产精品久久国产三级国电话系列| 欧美久久在线| 欧美精品一区二区三区在线看午夜| 欧美电影免费观看高清| 蜜臀av在线播放一区二区三区| 久久九九热re6这里有精品| 欧美一区二区视频网站| 欧美亚洲午夜视频在线观看| 亚洲欧美日韩天堂| 亚洲欧美网站| 性欧美精品高清| 欧美在线一级视频| 久久国产精品黑丝| 久久国产一区二区| 久久久亚洲综合| 久久一二三区| 悠悠资源网久久精品| 伊人成人在线| 在线日韩av片| 亚洲激情欧美| 亚洲麻豆av|