<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. C語言

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

    時間:2025-03-30 14:15:00 C語言 我要投稿
    • 相關推薦

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

      在linux內核代碼中,經常看到do...while(0)的宏,do...while(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語句,又能消除代碼冗余,可以考慮使用下面的 do...while(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...else...

      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();

      錯誤出在“;”直接位于代碼塊的后面,解決的辦法是將代碼嵌入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循環07-19

    C語言中AddRef和Release的使用技巧07-15

    C語言中用ASSERT調試的8大技巧06-26

    c語言中使用環境變量的技巧07-13

    C語言中的整數06-16

    C語言中的字符07-18

    C語言中用ASSERT調試的八大技巧06-18

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

    C語言中volatile的含義08-14

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人