- 相關(guān)推薦
C語言中do...while(0)技巧
在linux內(nèi)核代碼中,經(jīng)常看到do...while(0)的宏,do...while(0)有很多作用,具體技巧有哪些呢?以下僅供參考!
1、避免goto語句:
通常,如果一個(gè)函數(shù)開始要分配一些資源,然后如果在中途遇到錯(cuò)誤則要退出函數(shù),當(dāng)然,退出前要釋放資源,我們的代碼可能如下:
#defien N 10
bool Execute()
{
// 分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOk = true;
// 執(zhí)行并進(jìn)行錯(cuò)誤處理
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;
}
// ..........
// 執(zhí)行成功,釋放資源并返回
free(p);
p = NULL;
return true;
}
這里最大的問題是代碼冗余,每增加一個(gè)操作,就要做相應(yīng)的錯(cuò)誤處理,非常不靈活,于是想到了一下的goto:
#defien N 10
bool Execute()
{
// 分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOk = true;
// 執(zhí)行并進(jìn)行錯(cuò)誤處理
bOk = func1();
if(!bOk) goto errorhandle;
bOk = func2();
if(!bOk) goto errorhandle;
bOk = func3();
if(!bOk) goto errorhandle;
// ..........
// 執(zhí)行成功,釋放資源并返回
free(p);
p = NULL;
return true;
errorhandle:
free(p);
p = NULL;
return false;
}
代碼冗余是解決了,但是引入了C語言中比較微妙的goto語句,雖然正確的使用goto語句可以大大提高程序的靈活性與簡潔性,但是會(huì)使我們的程序捉摸不定,為了既避免使用goto語句,又能消除代碼冗余,可以考慮使用下面的 do...while(0):
#defien N 10
bool Execute()
{
//分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOK = true;
do {
//執(zhí)行并進(jìn)行錯(cuò)誤處理
bOK = fun1();
if(!bOK) break;
bOK = fun2();
if(!bOK) break;
bOK = fun3();
if(!bOK) break;
//.........
} while(0);
//釋放資源
free(p);
p = NULL;
return bOK;
}
2、避免空聲明在編譯時(shí)出現(xiàn)警告:
在linux內(nèi)核源代碼中,經(jīng)?吹饺缦潞暌员苊庠诰幾g時(shí)出現(xiàn)警告:
#define FOO do { } while(0)
3、編寫符合習(xí)慣的代碼塊:
你可能經(jīng)常會(huì)使用如下的宏:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
然而在某些情況下將會(huì)失效,下面的代碼使用if...else...
if (x > y)
exch(x,y); // 分支 1
else
do_something(); // 分支 2
但是將被解釋為一個(gè)分支的if語句:
if (x > y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空語句
else // ERROR!!!
do_something();
錯(cuò)誤出在“;”直接位于代碼塊的后面,解決的辦法是將代碼嵌入do...while(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、在條件語句中使用復(fù)雜的宏:
假如一個(gè)宏包含類似如下幾行代碼:
#define FOO(x)
printf("arg is %s ", x);
do_something_useful(x);
現(xiàn)在想像一下下面的代碼:
if (blah == 2)
FOO(blah);
這將解釋為:
if (blah == 2)
printf("arg is %s ", blah);
do_something_useful(blah);;
我們就會(huì)發(fā)現(xiàn),if語句只作用于printf(), do_something_useful() 沒按照愿意一起執(zhí)行,即沒有像你預(yù)期的那樣被包含在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)
【C語言中do...while(0)技巧】相關(guān)文章:
C語言中while循環(huán)和do...while循環(huán)07-19
c語言中使用環(huán)境變量的技巧07-13
C語言中的整數(shù)06-16
C語言中的字符07-18
在C語言中用ASSERT調(diào)試的八個(gè)技巧11-11
C語言中volatile的含義08-14