<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>

            C語言中do...while(0)技巧

            時間:2025-12-06 11:46:15 C語言 我要投稿

            C語言中do...while(0)技巧

              在linux內核代碼中,經常看到do...while(0)的宏,do...while(0)有很多作用,具體技巧有哪些呢?以下僅供參考!

              1、避免goto語句:

              通常,如果一個函數開始要分配一些資源,然后如果在中途遇到錯誤則要退出函數,當然,退出前要釋放資源,我們的代碼可能如下:

              #defien N 10

              bool Execute()

              {

              /pic/p>

              int *p = (int *)malloc(N * sizeof(int));

              bool bOk = true;

              /pic/p>

              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;

              }

              /pic/p>

              /pic/p>

              free(p);

              p = NULL;

              return true;

              }

              這里最大的問題是代碼冗余,每增加一個操作,就要做相應的錯誤處理,非常不靈活,于是想到了一下的goto:

              #defien N 10

              bool Execute()

              {

              /pic/p>

              int *p = (int *)malloc(N * sizeof(int));

              bool bOk = true;

              /pic/p>

              bOk = func1();

              if(!bOk) goto errorhandle;

              bOk = func2();

              if(!bOk) goto errorhandle;

              bOk = func3();

              if(!bOk) goto errorhandle;

              /pic/p>

              /pic/p>

              free(p);

              p = NULL;

              return true;

              errorhandle:

              free(p);

              p = NULL;

              return false;

              }

              代碼冗余是解決了,但是引入了C語言中比較微妙的goto語句,雖然正確的使用goto語句可以大大提高程序的靈活性與簡潔性,但是會使我們的程序捉摸不定,為了既避免使用goto語句,又能消除代碼冗余,可以考慮使用下面的 do...while(0):

              #defien N 10

              bool Execute()

              {

              /pic/p>

              int *p = (int *)malloc(N * sizeof(int));

              bool bOK = true;

              do {

              /pic/p>

              bOK = fun1();

              if(!bOK) break;

              bOK = fun2();

              if(!bOK) break;

              bOK = fun3();

              if(!bOK) break;

              /pic/p>

              } while(0);

              /pic/p>

              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...else...

              if (x > y)

              exch(x,y);  /pic/p>

              else

              do_something(); /pic/p>

              但是將被解釋為一個分支的if語句:

              if (x > y) {

              int tmp;

              tmp = x;

              x = y;

              y = tmp;

              }

              ;    /pic/p>

              else   /pic/p>

              do_something();

              錯誤出在“;”直接位于代碼塊的后面,解決的辦法是將代碼嵌入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、在條件語句中使用復雜的宏:

              假如一個宏包含類似如下幾行代碼:

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

            【C語言中do...while(0)技巧】相關文章:

            C語言中while循環和do...while循環02-01

            C語言中AddRef和Release的使用技巧12-22

            C語言中的字符11-06

            C語言中的整數03-15

            c語言中使用環境變量的技巧10-04

            C語言中用ASSERT調試的8大技巧09-03

            在C語言中用ASSERT調試的八個技巧02-23

            C語言中用ASSERT調試的八大技巧11-07

            C語言中sizeof的用法12-15

            • 相關推薦

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院