精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C 語言函數(shù)宏封裝妙招

開發(fā) 前端
在 {}、do{...}while(0)? 和 ({})? 這三種函數(shù)宏的封裝方式之中,應(yīng)盡可能不使用 {}?,考慮兼容性一般選擇使用 do{...}while(0)?,當(dāng)需要函數(shù)宏返回時可以考慮使用 ({}) 或直接定義函數(shù)。?

1. 函數(shù)宏介紹

函數(shù)宏,即包含多條語句的宏定義,其通常為某一被頻繁調(diào)用的功能的語句封裝,且不想通過函數(shù)方式封裝來降低額外的彈棧壓棧開銷。

函數(shù)宏本質(zhì)上為宏,可以直接進行定義,例如:

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

但上述的宏具有一個明顯的缺點:當(dāng)遇到 if、while 等語句且不使用花括號僅調(diào)用宏時,實際作用范圍在宏的第一個分號后便結(jié)束。即 a = b 和 b = tmp 均不受控制語句所作用。

因此,在工程中,一般使用三種方式來對函數(shù)宏進行封裝,分別為 {}、do{...}while(0) 和 ({})。下文將一一對三種方式進行分析,比較各自的優(yōu)劣點。

2. {} 方式

INT_SWAP 宏使用 {} 封裝后形態(tài)如下:

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

此時,直接調(diào)用與在無花括號的控制語句(如 if、while)中調(diào)用均能正常運行,例如:

#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
}

但當(dāng)無花括號的 if 語句存在其他分支(else if、else 等)如:

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

會發(fā)現(xiàn)編譯出錯:

...
/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); 最后的 ; 已經(jīng)把 if 的作用域終結(jié)了,后續(xù)的 else 當(dāng)然沒有找到與之匹配的 if 了。

因此,解決方法有兩種,分別為不使用 ;(port.1)或規(guī)定必須使用帶花括號的 if(port.2),例如:

/* 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");
}

可見,不使用 ; 的調(diào)用方式無論從程序閱讀還是使用方法方面都是十分別扭的;而規(guī)定必須使用帶花括號的 if 的調(diào)用方式有違常理的,因為宏函數(shù)應(yīng)該適用于任何語法。

優(yōu)缺點總結(jié):

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

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

INT_SWAP 宏使用 do{...}while(0) 封裝后形態(tài)如下:

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

do{...}while(0) 表示只執(zhí)行一遍 {} 內(nèi)的語句,表象來說與 {} 的功能是一致的。不同的是,do{...}while(0) 可以提前退出函數(shù)宏、整合為一條語句與強制調(diào)用時必須使用 ;。

由于 do{...}while(0) 實際為 while 循環(huán),因此可以使用關(guān)鍵字 break 提前結(jié)束循環(huán)。利用該特性,可以為函數(shù)宏添加參數(shù)檢測。例如:

#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) 方式的函數(shù)宏可以在無花括號且有分支的 if 語句中直接調(diào)用。例如:

#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 語言規(guī)定,do{...}while(0) 語法必須使用 ; 作為語句結(jié)尾。因此不可能存在以下語句的程序出現(xiàn):

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

優(yōu)缺點總結(jié):

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

4. ({}) 方式

({}) 為 GNU C 擴展的語法,非 C 語言的原生語法。

INT_SWAP 宏使用 ({}) 封裝后形態(tài)如下:

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

與 do{...}while(0) 相同,({}) 支持在無花括號且有分支的 if 語句中直接調(diào)用。例如:

#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) 不同的是,({}) 不能提前退出函數(shù)宏與支持返回值。({}) 畢竟不是 while 循環(huán),不能直接使用 break退出函數(shù)宏是比較容易理解。那支持返回值是什么意思呢?

答案是 C 語言規(guī)定 ({}) 中的最后一條語句的結(jié)果為該雙括號體的返回值。例如:

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

因此,({}) 可以為函數(shù)宏提供返回值。例如:

#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 宏已與函數(shù)十分接近。

優(yōu)缺點總結(jié):

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

5. 總結(jié)

綜上,在 {}、do{...}while(0) 和 ({}) 這三種函數(shù)宏的封裝方式之中,應(yīng)盡可能不使用 {},考慮兼容性一般選擇使用 do{...}while(0),當(dāng)需要函數(shù)宏返回時可以考慮使用 ({}) 或直接定義函數(shù)。

責(zé)任編輯:趙寧寧 來源: 物聯(lián)網(wǎng)IoT技術(shù)
相關(guān)推薦

2024-01-22 00:35:00

C++函數(shù)開發(fā)

2023-10-26 11:03:50

C語言宏定義

2022-09-20 11:07:00

C語言X-MACRO技巧

2022-07-29 13:10:16

C語言宏定義命令

2022-02-09 18:15:10

語言宏定義軟件

2010-01-21 15:07:31

C++開發(fā)

2022-08-05 13:38:08

C語言庫函數(shù)printf()

2014-02-10 15:05:37

C語言封裝

2023-02-17 08:14:29

C語言C技巧內(nèi)存

2025-03-28 10:39:17

C++宏定義語言

2011-03-30 11:01:13

C語言隨機

2010-06-03 10:26:29

開發(fā)MySQL中文亂碼

2011-07-15 01:20:58

C指針函數(shù)函數(shù)指針

2010-02-05 15:59:26

C++函數(shù)重載

2011-06-15 11:05:14

C語言回調(diào)函數(shù)

2010-01-25 17:05:37

C++語言

2021-01-13 06:58:35

C語言函數(shù)指針

2010-01-18 13:54:28

函數(shù)

2011-07-15 12:41:53

C語言

2011-07-15 11:07:41

C語言字符串函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

久久精品福利| 四季av日韩精品一区| 国产成人黄色| 在线不卡的av| 97中文字幕在线| 日本在线视频1区| 麻豆国产一区二区| 国产69精品久久久久99| 国产真实乱人偷精品人妻| 欧美爱爱视频| 精品福利樱桃av导航| 性欧美.com| 天天操天天操天天干| 欧美a一区二区| 欧美激情在线观看视频| 女人十八毛片嫩草av| 91麻豆精品激情在线观看最新 | 日本а中文在线天堂| 国产日韩亚洲欧美综合| 国产v亚洲v天堂无码| 在线观看免费视频a| 亚洲精品国产日韩| 久热国产精品视频| 久久久久无码精品国产sm果冻| 91大神精品| 欧美精品久久久久久久多人混战| 日本www在线播放| 日本成人不卡| 亚洲欧美一区二区久久| 涩涩涩999| 九九九伊在人线综合| 成人性生交大片免费看视频在线| 国产一区二区在线免费| 亚洲精品一区二三区| 99亚洲一区二区| 欧美高清在线视频观看不卡| 午夜精品久久久久99蜜桃最新版| 视频一区欧美| 国产手机视频精品| 日本japanese极品少妇| 国产精品中文字幕制服诱惑| 日韩视频一区二区| 亚洲国产日韩在线一区| 中文幕av一区二区三区佐山爱| 色狠狠av一区二区三区| 18禁免费无码无遮挡不卡网站| 牛牛在线精品视频| 一区二区激情视频| 国产精品视频二| 尤物视频在线看| 一区二区在线看| 精品日韩在线播放| 成年人网站在线| 亚洲手机成人高清视频| 国产精品jizz在线观看老狼| 欧美性天天影视| 中文字幕一区在线观看视频| 一区一区视频| 国产福利视频在线| 一区二区三区精密机械公司| 亚洲精品天堂成人片av在线播放| 91网在线看| 亚洲电影一级黄| 播放灌醉水嫩大学生国内精品| 2022成人影院| 欧美午夜片在线看| 中文字幕丰满乱码| 日本少妇精品亚洲第一区| 精品噜噜噜噜久久久久久久久试看| 免费黄色av网址| 久久99精品国产自在现线| 日韩精品在线视频| 调教驯服丰满美艳麻麻在线视频| 色综合久久网| 欧美激情极品视频| 亚洲精品午夜国产va久久成人| 亚洲综合日韩| 国产精品一区久久久| 国产免费黄色录像| a在线欧美一区| 日韩高清dvd| av理论在线观看| 天天影视网天天综合色在线播放| 国产a级片免费观看| 欧美爱爱视频| 亚洲精品电影网| 日本视频在线免费| 狠狠色丁香久久综合频道| 欧美中文在线字幕| 国产男男gay体育生网站| 成人不卡免费av| 图片区小说区区亚洲五月| 成人免费高清| 91福利资源站| 亚洲一区二区三区四区av| 精品国产一区二区三区四区| 欧美精品午夜视频| 国产成人在线免费视频| 国产在线精品免费| 精品在线不卡| 国产秀色在线www免费观看| 亚洲高清中文字幕| 亚洲美女性囗交| 综合干狼人综合首页| 久久在精品线影院精品国产| 精品不卡一区二区| 成人一区二区三区视频在线观看| 日韩免费一区二区三区| 91超碰在线免费| 欧美精品aⅴ在线视频| 国产人妻人伦精品1国产丝袜| 国产精品久久久久久麻豆一区软件 | 91久久精品久久国产性色也91| 污视频网站在线播放| 亚洲丝袜自拍清纯另类| 国内外免费激情视频| 99国产精品免费网站| 日韩在线一区二区三区免费视频| 精品91久久久| 国产成人99久久亚洲综合精品| 亚洲欧洲免费无码| 亚洲黄色中文字幕| 亚洲国产天堂网精品网站| 国产一区二区精彩视频| 日韩黄色片在线观看| 久久资源av| 69av成人| 精品处破学生在线二十三| 国产一区二区三区在线视频观看| 秋霞影院一区二区| 欧美日韩日本网| www.成人影院| 日韩精品免费在线播放| 国产一级一片免费播放放a| 激情欧美一区二区三区在线观看| 日韩欧美一区二区三区久久婷婷| 男人添女人下部高潮视频在线观看| 在线播放中文字幕一区| 91久久久久久久久久久久久久| 日韩精彩视频在线观看| 青青成人在线| 日产精品一区| 中国china体内裑精亚洲片| 成人免费毛片视频| 久久久久国产成人精品亚洲午夜| a√天堂在线观看| 爽爽窝窝午夜精品一区二区| 57pao国产精品一区| 欧美性孕妇孕交| 色综合咪咪久久| 四虎永久免费在线观看| 老司机精品久久| 日韩欧美亚洲日产国产| 久久人人视频| 久久精品视频中文字幕| 99精品视频免费看| 亚洲国产综合色| 亚洲av成人无码一二三在线观看| 亚洲免费播放| 日本成人黄色免费看| 国精产品一区二区三区有限公司| 最近2019年中文视频免费在线观看 | 久久久久久国产精品mv| 午夜日韩成人影院| 正在播放亚洲1区| 国产男男gay体育生白袜| 亚洲一卡二卡三卡四卡| jizz日本免费| 免费观看成人av| 在线观看17c| 欧美成人专区| 国产精品男女猛烈高潮激情| 久久久久久国产精品免费无遮挡| 精品日韩欧美在线| 五月天综合激情网| 国产精品二三区| www.com日本| 日韩精品一二三四| 2022中文字幕| 亚洲资源网站| 91免费综合在线| 精精国产xxxx视频在线野外| 亚洲天堂一区二区三区| 国产日韩欧美一区二区东京热 | 日日碰狠狠添天天爽超碰97| 国产成人短视频在线观看| 91免费视频网站| 在线免费看h| 精品国产欧美一区二区三区成人 | 91麻豆精品一二三区在线| 欧美激情免费视频| 国产乱理伦片a级在线观看| 911精品国产一区二区在线| 日韩无码精品一区二区三区| 国产精品乱码一区二区三区软件| 精品人妻一区二区免费| 免费成人小视频| 久久黄色片视频| 在线看片不卡| 日韩亚洲视频在线| 鲁大师精品99久久久| 国产欧美韩国高清| 中文字幕这里只有精品| 欧美成年人视频| av在线首页| 亚洲精品国产精品久久清纯直播| 一本久道久久综合无码中文| 欧美日韩激情美女| 欧美黄色免费观看| 国产精品视频九色porn| 国产精品伦子伦| 国产精品夜夜嗨| 亚洲欧美国产中文| 欧美资源在线| 国产成人无码精品久久久性色| 91成人网在线观看| 神马一区二区影院| 亚洲三级精品| 国产精品日本一区二区| 久久久久久久久久久久电影| 国产精品白丝jk喷水视频一区 | 亚洲国产日本| 日韩国产精品毛片| 欧美激情电影| 特级西西444www大精品视频| 亚州国产精品| 精品网站在线看| 91免费精品国偷自产在线在线| 成人久久精品视频| 在线观看欧美| 成人黄色影片在线| 中文字幕日本一区| 成人h片在线播放免费网站| 91成人在线| 国产精品久久久久久久午夜| 日韩成人动漫| 国产不卡av在线免费观看| 在线天堂新版最新版在线8| 97超碰国产精品女人人人爽| av3级在线| 91国语精品自产拍在线观看性色 | 国产一级网站视频在线| 国产视频一区在线| 久青青在线观看视频国产| 亚洲乱码av中文一区二区| 五月婷婷六月色| 亚洲区在线播放| 黄色小视频在线免费观看| 夜夜嗨av一区二区三区四区 | 国产绳艺sm调教室论坛| 69堂国产成人免费视频| 国产乱淫a∨片免费观看| 欧美一区二区女人| 亚洲风情第一页| 亚洲成人黄色在线观看| 四虎免费在线观看| 亚洲欧美日韩爽爽影院| 国产免费永久在线观看| 中文亚洲视频在线| 麻豆传媒在线完整视频| 精品国产一区二区三区久久久| 亚洲色图美国十次| 97激碰免费视频| 欧美日韩免费看片| 国产日韩亚洲欧美| 亚洲高清在线一区| 精品一区在线播放| 精品国产中文字幕第一页| 黄频视频在线观看| 在线播放不卡| 妺妺窝人体色www在线观看| 精品一区二区三区免费| 国产人妻精品午夜福利免费| 91亚洲精华国产精华精华液| 伊人网伊人影院| 国产精品久久久久影院亚瑟| 久久这里只有精品免费| 色哟哟国产精品免费观看| 国产精品国产三级国产普通话对白 | 久久久999免费视频| 日本怡春院一区二区| www激情五月| 91欧美激情一区二区三区成人| 中国特黄一级片| 亚洲第一综合色| 中文字幕乱码中文字幕| 精品国产亚洲在线| 国产爆初菊在线观看免费视频网站| 成人97在线观看视频| av电影一区| 91手机在线播放| 成人久久综合| 亚洲色成人www永久在线观看| 久久午夜视频| 逼特逼视频在线观看| 中文字幕av在线一区二区三区| 男女免费视频网站| 欧美三级电影精品| 香蕉视频911| 久久成人亚洲精品| 91av一区| 欧美一进一出视频| 国产精品啊v在线| 亚洲免费黄色录像| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩激情在线观看| 欧美性猛交xxxx黑人交| 四虎精品成人影院观看地址| 欧美成人性生活| 久久久久黄色| 四虎永久国产精品| 翔田千里一区二区| 北京富婆泄欲对白| 亚洲免费观看高清完整版在线 | 久久久久久久中文字幕| 欧美日韩一区国产| 免费a级毛片在线观看| 韩国v欧美v日本v亚洲| 欧美精品三级在线| 亚洲日本japanese丝袜| 媚黑女一区二区| a天堂视频在线观看| 一区二区三区精品在线| 国产精品自拍电影| 日韩在线高清视频| 99riav视频一区二区| 欧美日韩高清免费| 亚洲综合国产激情另类一区| 三级男人添奶爽爽爽视频| 亚洲综合一二三区| 精品国产乱码一区二区三| 久久久久www| 亚洲精品aa| 国产四区在线观看| 国产在线看一区| 老湿机69福利| 欧美zozozo| 欧美xxxx免费虐| 国产精品swag| 极品中文字幕一区| 久久久久亚洲av无码网站| 亚洲综合久久久久| 亚洲精品国产精品乱码不卡| 欧美激情精品久久久久久免费印度 | 老司机在线看片网av| 成人av色在线观看| 欧美1级日本1级| 在线看黄色的网站| 婷婷综合五月天| 激情在线视频| 国产精品入口夜色视频大尺度 | 激情视频综合网| 国产女人水真多18毛片18精品视频| 无码人妻丰满熟妇区bbbbxxxx| 亚洲视频日韩精品| 四虎永久精品在线| 日韩一级免费看| 99在线精品观看| 欧美一区二区三区网站| 国产亚洲a∨片在线观看| 国产美女久久| 免费成人进口网站| 成人激情视频网站| 天堂网一区二区三区| 亚洲一区二区久久久| 欧美天堂一区二区| 久久亚洲a v| 久久久久久免费网| 中文在线观看av| 欧美成人免费全部| 精品人人人人| a在线观看免费视频| 亚洲精品高清在线| 日韩av成人| 成人欧美一区二区三区黑人| 国内精品福利| 亚洲理论片在线观看| 7777女厕盗摄久久久| a级大胆欧美人体大胆666| 日本一区二区在线| 国产成人免费视频精品含羞草妖精| 日韩伦人妻无码| 日韩在线观看免费全| 久久夜色精品国产噜噜av小说| 欧美在线观看视频网站| 中文字幕综合网| 你懂的视频在线| 亚洲在线免费看| 久久精品人人| 天天看片中文字幕| 国产一区二区三区视频| 在这里有精品| 日日干夜夜操s8| 精品日本美女福利在线观看| 色多多视频在线观看| 久久精品久久精品国产大片| 韩国三级中文字幕hd久久精品| 天天干在线播放| 久久99国产精品自在自在app | 日韩精品一区二区三区中文|