奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語言

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

時間:2024-09-16 13:46:06 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語言中AddRef和Release的使用技巧07-15

C 語言中宏的使用08-02

C語言中assert的用法06-02

C語言中的運算規則10-14

C語言中的字符(char)09-24

C語言中sizeof的用法09-09

C語言中函數的區分08-30

c語言中什么是變量08-22

c語言中bit的用法11-01

C語言中的鏈接編寫05-26

主站蜘蛛池模板: 深水埗区| 浮山县| 唐河县| 沂南县| 英超| 烟台市| 祥云县| 定南县| 隆回县| 南木林县| 沛县| 宝丰县| 常德市| 襄城县| 新建县| 贵溪市| 尤溪县| 安吉县| 绥芬河市| 红安县| 潞西市| 武宣县| 湖南省| 辉县市| 东宁县| 开远市| 大足县| 武鸣县| 青岛市| 巴里| 太原市| 新竹县| 怀集县| 五大连池市| 林州市| 乌拉特前旗| 太谷县| 新安县| 比如县| 绥芬河市| 乌兰县|