<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. 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

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