C語言在linux核心中do while(0)妙用之法

來源:互聯網
上載者:User

標籤:pop   img   .net   並且   寫代碼   sso   實現   out   enter   

為什麼說do while(0) 妙?由於它的確就是妙,並且在linux核心中實現是相當的妙,我們來看看核心中的相關代碼:

#define db_error(fmt, ...)     do {  fprintf(stderr, "(error): ");   fprintf(stderr, fmt, ##__VA_ARGS__);         } while (0)
這僅僅是個普通的調試資訊的輸出。有人便會覺得。你這不是多此一舉嗎?去掉do while(0)不一樣也實現了嗎?事實上不然,我們看看範例就清楚了,雖然非常easy:

int main(void){while(0){  printf("hello world\n");}do{printf("hello world1\n");}while(0);return 0 ; }
這是一段簡單到不能再簡單的代碼了。但還是要提一下。請看執行結果:

誰都知道第一個while(0)肯定是不會執行的,由於while()括弧裡的數值等於0。邏輯判定為假。即代碼塊中的hello world不會執行,可是do while(0)就不一樣了,do while(0)即使條件不成立。也會拼了老命的去執行一次!

也就是說。為什麼核心代碼要這樣來做,這是由於核心代碼採用do{}while(0);這種結構能夠保證不管在什麼地方都能夠正確的運行一次 ,這就是它用得最妙的地方,否則有時候偵錯工具的時候,單單的調試語句寫了沒列印事實上是非常正常的事情,不知道大家寫代碼的時候有沒有遇到過。反正我是遇到過了。後來就是用這種一種方法定位到錯誤點,順利改正。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

代碼雖簡單。可是用好用精熟練使用不一定什麼時候都能想得到,越簡單的東西,有時候,適用價值還是非常好的!

分享下面我實現的調試輸出程式,以後能夠拿來當模版開發了:

#include <stdio.h>#include <stdarg.h>//核心代碼採用do{}while(0);這樣的結構能夠保證不管在什麼地方都能夠正確的執行一次 #define db_error(fmt, ...)     do {  fprintf(stderr, "(error): ");   fprintf(stderr, fmt, ##__VA_ARGS__);  } while (0)    #define db_msg(fmt, ...)     do {               fprintf(stdout, "(msg): ");  fprintf(stdout, fmt, ##__VA_ARGS__);    } while (0)    #define db_warn(fmt, ...)     do { fprintf(stdout, "(warn): ");  fprintf(stdout, fmt, ##__VA_ARGS__);     } while (0)    #define db_debug(fmt, ...)     do {     fprintf(stdout, "(debug): ");  fprintf(stdout, fmt, ##__VA_ARGS__);     } while (0)int main(void){db_error("h\n");db_warn("e\n");db_debug("llo\n");return 0 ;}
執行結果:

調試資訊在前,非常快就能夠知道在什麼地方列印的語句,方便DEBUG!

迅速找到程式bug的定位!

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

C語言在linux核心中do while(0)妙用之法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.