C語言中do...while(0)技巧
在linux核心程式碼中,經常看到e(0)的巨集,e(0)有很多作用,具體技巧有哪些呢?以下僅供參考!
1、避免goto語句:
通常,如果一個函式開始要分配一些資源,然後如果在中途遇到錯誤則要退出函式,當然,退出前要釋放資源,我們的程式碼可能如下:
#defien N 10
bool Execute()
{
// 分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOk = true;
// 執行並進行錯誤處理
bOk = func1();
if(!bOk)
{
free(p);
p = NULL;
return false;
}
bOk = func2();
if(!bOk)
{
free(p);
p = NULL;
return false;
}
bOk = func3();
if(!bOk)
{
free(p);
p = NULL;
return false;
}
// ..........
// 執行成功,釋放資源並返回
free(p);
p = NULL;
return true;
}
這裡最大的問題是程式碼冗餘,每增加一個操作,就要做相應的錯誤處理,非常不靈活,於是想到了一下的goto:
#defien N 10
bool Execute()
{
// 分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOk = true;
// 執行並進行錯誤處理
bOk = func1();
if(!bOk) goto errorhandle;
bOk = func2();
if(!bOk) goto errorhandle;
bOk = func3();
if(!bOk) goto errorhandle;
// ..........
// 執行成功,釋放資源並返回
free(p);
p = NULL;
return true;
errorhandle:
free(p);
p = NULL;
return false;
}
程式碼冗餘是解決了,但是引入了C語言中比較微妙的goto語句,雖然正確的使用goto語句可以大大提高程式的靈活性與簡潔性,但是會使我們的程式捉摸不定,為了既避免使用goto語句,又能消除程式碼冗餘,可以考慮使用下面的` e(0):
#defien N 10
bool Execute()
{
//分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOK = true;
do {
//執行並進行錯誤處理
bOK = fun1();
if(!bOK) break;
bOK = fun2();
if(!bOK) break;
bOK = fun3();
if(!bOK) break;
//.........
} while(0);
//釋放資源
free(p);
p = NULL;
return bOK;
}
2、避免空宣告在編譯時出現警告:
在linux核心原始碼中,經常看到如下巨集以避免在編譯時出現警告:
#define FOO do { } while(0)
3、編寫符合習慣的程式碼塊:
你可能經常會使用如下的巨集:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
然而在某些情況下將會失效,下面的程式碼使用...
if (x > y)
exch(x,y); // 分支 1
else
do_something(); // 分支 2
但是將被解釋為一個分支的if語句:
if (x > y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空語句
else // ERROR!!!
do_something();
錯誤出在“;”直接位於程式碼塊的後面,解決的辦法是將程式碼嵌入e(0),於是得到下面的程式碼:
if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();
於是上面的巨集可以修改為:
#define exch(x,y) do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0)
4、在條件語句中使用複雜的巨集:
假如一個巨集包含類似如下幾行程式碼:
#define FOO(x)
printf("arg is %s", x);
do_something_useful(x);
現在想像一下下面的程式碼:
if (blah == 2)
FOO(blah);
這將解釋為:
if (blah == 2)
printf("arg is %s", blah);
do_something_useful(blah);;
我們就會發現,if語句只作用於printf(), do_something_useful() 沒按照願意一起執行,即沒有像你預期的那樣被包含在if程式碼中,於是可以使用如下的程式碼塊:
if (blah == 2)
do {
printf("arg is %s", blah);
do_something_useful(blah);
} while (0);
這樣上面的巨集就可以改為:
#define FOO(x) do {
printf("arg is %s", blah);
do_something_useful(blah);
} while (0)
-
2017年3月計算機二級C語言考試摸底測試題
以下是yjbys考試網小編整理的2017年3月計算機二級C語言考試摸底測試題,希望對大家有所幫助,祝大家計算機二級考試順利通過。一、選擇題(每小題1分。)(1)程式流程圖中帶有箭頭的線段表示的是()。A.圖元關係B.資料流C.控制流D.呼叫關係(2)結構化程式設計的基本原則...
-
C語言if else語句彙總
對於很多情況,順序結構的程式碼是遠遠不夠的,大家都接觸過C語言吧,下面是小編為大家整理的C語言ifelse語句,希望對大家有所幫助。C語言ifelse語句在C語言中,使用if和else關鍵字對條件進行判斷。請先看下面的程式碼:#includeintmain(){intage;printf("請輸入你的年齡:");sc...
-
C語言精選面試題詳解
C語言是IT程式設計中最基礎的語言,在面試中,基本可以忽略又或者格外重要。下面是小編為大家整理的C語言精選面試題詳解,歡迎參考~分析這些面試題,本身包含很強的趣味性;而作為一名研發人員,通過對這些面試題的深入剖析則可進一步增強自身的內功。試題1:以下是引用片段:voi...
-
2017年計算機二級考試C語言備考題及答案
計算機二級對於很多考生來說還是比較有難度的,那麼怎樣順利通過二級考試呢?這就需要大家平時多練習和找方法了。以下是本站小編整理的2017年計算機二級考試C語言備考題及答案,希望對大家有幫助!1.(A)是構成C語言程式的基本單位。A、函式B、過程C、子程式D、子例...
相關文章
- How my school life has changed英語作文
- Wuhan Heping Middle School 英語作文
- C語言中while迴圈和do...while迴圈
- How to Spend the Winter Holiday國中英語作文
- Lesson4Whatdidyoudoafterschool五年級英語教學設計
- 英語閱讀範文:WeNeverToldHimHeCouldn’t
- Which Mode of Travel Do You like為題目的作文
- How I Finance My College Education英語作文
- 英語作文Some advice on how to learn English well
- Linux下如何編寫第一個C語言hello world程式