亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

淺談do {...} while (0) 在宏定義中的作用

2020-01-26 14:19:23
字體:
來源:轉載
供稿:網友

如果你是一名C程序員,你肯定很熟悉宏,它們非常強大,如果正確使用可以讓你的工作事半功倍。然而,如果你在定義宏時很隨意沒有認真檢查,那么它們可能使你發狂,浪費N多時間。在很多的C程序中,你可能會看到許多看起來不是那么直接的較特殊的宏定義。

下面就是一個例子:

#define __set_task_state(tsk, state_value)   /   do { (tsk)->state = (state_value); } while (0) 

在Linux內核和其它一些著名的C庫中有許多使用do{...}while(0)的宏定義。這種宏的用途是什么?有什么好處?

Google的Robert Love(先前從事Linux內核開發)給我們解答如下:

do{...}while(0)在C中是唯一的構造程序,讓你定義的宏總是以相同的方式工作,這樣不管怎么使用宏(尤其在沒有用大括號包圍調用宏的語句),宏后面的分號也是相同的效果。

這句話聽起來可能有些拗口,其實用一句話概括就是:使用do{...}while(0)構造后的宏定義不會受到大括號、分號等的影響,總是會按你期望的方式調用運行。

例如:

#define foo(x) bar(x); baz(x) 

然后你可能這樣調用:

foo(wolf); 

這將被宏擴展為:

bar(wolf); baz(wolf); 

這的確是我們期望的正確輸出。下面看看如果我們這樣調用:

if (!feral) foo(wolf); 

那么擴展后可能就不是你所期望的結果。上面語句將擴展為:

if (!feral) bar(wolf); baz(wolf); 

顯而易見,這是錯誤的,也是大家經常易犯的錯誤之一。


幾乎在所有的情況下,期望寫多語句宏來達到正確的結果是不可能的。你不能讓宏像函數一樣行為――在沒有do/while(0)的情況下。

如果我們使用do{...}while(0)來重新定義宏,即:

#define foo(x) do { bar(x); baz(x); } while (0) 

現在,該語句功能上等價于前者,do能確保大括號里的邏輯能被執行,而while(0)能確保該邏輯只被執行一次,即與沒有循環時一樣。

對于上面的if語句,將會被擴展為:

if (!feral) do { bar(wolf); baz(wolf); } while (0); 

從語義上講,它與下面的語句是等價的:

if (!feral) {   bar(wolf);   baz(wolf); } 

這里你可能感到迷惑不解了,為什么不用大括號直接把宏包圍起來呢?為什么非得使用do/while(0)邏輯呢?

例如,我們用大括號來定義宏如下:

#define foo(x) { bar(x); baz(x); } 

這對于上面舉的if語句的確能被正確擴展,但是如果我們有下面的語句調用呢:

if (!feral)   foo(wolf); else  bin(wolf); 

宏擴展后將變成:

if (!feral) {   bar(wolf);   baz(wolf); }; else  bin(wolf); 

大家可以看出,這就有語法錯誤了。

總結:Linux和其它代碼庫里的宏都用do/while(0)來包圍執行邏輯,因為它能確保宏的行為總是相同的,而不管在調用代碼中使用了多少分號和大括號。

以上這篇淺談do {...} while (0) 在宏定義中的作用就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久久新婚| 久久av红桃一区二区小说| 日韩午夜在线视频| 国产精品视频白浆免费视频| 8050国产精品久久久久久| 亚洲激情视频网| 欧美主播福利视频| 精品美女国产在线| 91久久久久久久一区二区| 岛国av一区二区在线在线观看| 色先锋久久影院av| 国产在线不卡精品| 亚洲男人av在线| 久久噜噜噜精品国产亚洲综合| 久久国产一区二区三区| 九九九久久国产免费| 久久久久久久久久婷婷| 久久韩剧网电视剧| 全色精品综合影院| 日韩电影免费在线观看| 中文字幕9999| 精品视频久久久久久久| 亚洲成人激情在线观看| 国产精品日韩在线| 成人精品视频99在线观看免费| 久久精品国产一区| 国产高清在线不卡| 欧美日韩综合视频| 国产午夜精品全部视频在线播放| 久久亚洲国产成人| 亚洲国产精品久久91精品| 亚洲国产日韩一区| 永久555www成人免费| 久久久久久久久久久av| 中文字幕亚洲欧美| 日韩欧美在线网址| 97精品伊人久久久大香线蕉| 亚洲九九九在线观看| 成人网中文字幕| 精品网站999www| 国产精品久久久久久久久久久久久久| 日韩精品在线视频| 久久久久久999| 欧美一级电影免费在线观看| 国产欧美久久一区二区| 久久精品视频网站| 国产日韩换脸av一区在线观看| 黑人欧美xxxx| 91精品中国老女人| 日韩av在线高清| 欧美成年人视频网站| 久久综合88中文色鬼| 亚洲一区二区三区在线视频| 97在线观看视频| 亚洲成av人影院在线观看| 久久手机精品视频| 欧美日韩免费一区| 中文字幕亚洲精品| 国产精品夜色7777狼人| 精品久久在线播放| 欧美午夜xxx| 久久久久久有精品国产| 久久久久亚洲精品| 国产精品欧美一区二区| 中文字幕亚洲欧美日韩高清| 午夜精品福利视频| 91久久在线视频| 日韩一区二区三区在线播放| 日韩美女福利视频| 亚洲伊人一本大道中文字幕| 亚洲精品网站在线播放gif| 久久伊人91精品综合网站| 97在线免费观看| 欧美午夜精品久久久久久浪潮| 亚洲午夜女主播在线直播| 亚洲欧美国产视频| 性色av一区二区三区红粉影视| 亚洲影院高清在线| 色yeye香蕉凹凸一区二区av| 色无极影院亚洲| 亚洲精品视频免费在线观看| 欧美精品免费在线观看| 欧美黄色片免费观看| 岛国精品视频在线播放| 亚洲精品456在线播放狼人| 亚洲福利在线视频| 欧美国产日韩一区| 成人羞羞国产免费| 国语自产偷拍精品视频偷| 91精品国产高清久久久久久91| 日韩大陆欧美高清视频区| 久久久黄色av| 久久精品成人一区二区三区| 亚洲欧美激情视频| 国产精品香蕉在线观看| 久久亚洲影音av资源网| 欧美亚洲视频在线观看| 国产网站欧美日韩免费精品在线观看| 黑人极品videos精品欧美裸| 欧美在线视频a| 欧美国产欧美亚洲国产日韩mv天天看完整| 91av国产在线| 伊人男人综合视频网| 亚洲美女av黄| 精品欧美一区二区三区| 久久影视电视剧免费网站清宫辞电视| 亚洲国语精品自产拍在线观看| 亚洲精品免费一区二区三区| 91免费在线视频| 色香阁99久久精品久久久| 亚洲淫片在线视频| 久久精品一偷一偷国产| 2024亚洲男人天堂| 亚洲天堂一区二区三区| 亚洲影院色无极综合| 97香蕉久久夜色精品国产| 亚洲性线免费观看视频成熟| 4444欧美成人kkkk| 国产日韩在线亚洲字幕中文| 国产精品自产拍在线观看中文| 色婷婷综合久久久久中文字幕1| 性色av一区二区三区| 欧美大尺度电影在线观看| 狠狠躁夜夜躁久久躁别揉| 久久视频中文字幕| 久久精品91久久香蕉加勒比| 国产区精品视频| 欧美日韩国产限制| 91黄色8090| 日本中文字幕不卡免费| 欧美日韩美女在线观看| 国产亚洲激情在线| 不卡av电影在线观看| 国产精品免费网站| 欧美成人精品h版在线观看| 97国产在线视频| 在线观看精品自拍私拍| 亚洲国产精品中文| 日韩精品999| 77777亚洲午夜久久多人| 亚洲精品久久久一区二区三区| 欧美疯狂xxxx大交乱88av| 亚洲免费人成在线视频观看| 久久久精品一区| 精品国产一区二区三区久久久| 97在线视频免费看| 日韩精品电影网| 欧美日韩精品二区| 日韩中文字在线| 欧美激情中文字幕乱码免费| 57pao国产精品一区| 日韩中文字幕在线观看| 国产一区二区三区在线播放免费观看| 狠狠久久亚洲欧美专区| 国产精品老牛影院在线观看| 欧美精品videossex性护士| 国产成人涩涩涩视频在线观看| 国产精品电影久久久久电影网| 国产精品久久久av久久久| 欧美巨乳美女视频| 久久人人97超碰精品888| 国产精品成人国产乱一区| 久久精品2019中文字幕| 欧美日韩在线看|