學習啦>學習英語>專業(yè)英語>計算機英語>

c語言宏的用法

時間: 長思709 分享
  C語言程序中廣泛的使用宏定義,采用關鍵字define進行定義,宏只是一種簡單的字符串替換,根據(jù)是否帶參數(shù)分為無參和帶參。宏的簡單應用很容易掌握,下面小編就跟大家分享下c語言宏的用法。
  c語言宏的用法如下:
       1.宏的基本構成
 ?。?)宏中包含特殊符號:#、##.
 ?。?)宏定義用do{ }while(0)
  2、特殊符號#、##
  (1)#
  Whenyouputa#beforeanargumentinapreprocessor macro,thepreprocessorturnsthatargumentintoacharacterarray.
  在一個宏中的參數(shù)前面使用一個#,預處理器會把這個參數(shù)轉換為一個字符數(shù)組
  簡化理解:#是“字符串化”的意思,出現(xiàn)在宏定義中的#是把跟在后面的參數(shù)轉換成一個字符串
  #define ERROR_LOG(module)   fprintf(stderr,"error: "#module"\n")
  ERROR_LOG("add"); 轉換為 fprintf(stderr,"error: "add"\n");
  ERROR_LOG(devied =0); 轉換為 fprintf(stderr,"error: devied=0\n");
  (2)##
  “##”是一種分隔連接方式,它的作用是先分隔,然后進行強制連接。
  在普通的宏定義中,預處理器一般把空格解釋成分段標志,對于每一段和前面比較,相同的就被替換。但是這樣做的結果是,被替換段之間存在一些空格。如果我們不希望出現(xiàn)這些空格,就可以通過添加一些##來替代空格。
  1 #define TYPE1(type,name)   type name_##type##_type
  2 #define TYPE2(type,name)   type name##_##type##_type
  TYPE1(int, c);轉換為:int  name_int_type ; (因為##號將后面分為 name_ 、type 、 _type三組,替換后強制連接)
  TYPE2(int, d);轉換為: int d_int_type ;(因為##號將后面分為 name、_、type 、_type四組,替換后強制連接)
  3、宏定義中do{ }while(0)
  第一眼看到這樣的宏時,覺得非常奇怪,為什么要用do……while(0)把宏定義的多條語句括起來?非常想知道這樣定義宏的好處是什么,于是google、百度一下了。
  采用這種方式是為了防范在使用宏過程中出現(xiàn)錯誤,主要有如下幾點:
 ?。?)空的宏定義避免warning:
  #define foo() do{}while(0)
  (2)存在一個獨立的block,可以用來進行變量定義,進行比較復雜的實現(xiàn)。
 ?。?)如果出現(xiàn)在判斷語句過后的宏,這樣可以保證作為一個整體來是實現(xiàn):
  #define foo(x) \
  action1(); \
  action2();
  在以下情況下:
  if(NULL == pPointer)
  foo();
  就會出現(xiàn)action1和action2不會同時被執(zhí)行的情況,而這顯然不是程序設計的目的。
 ?。?)以上的第3種情況用單獨的{}也可以實現(xiàn),但是為什么一定要一個do{}while(0)呢,看以下代碼:
  #define switch(x,y) {int tmp; tmp="x";x=y;y=tmp;}
  if(x>y)
  switch(x,y);
  else   //error, parse error before else
  otheraction();
  在把宏引入代碼中,會多出一個分號,從而會報錯。這對這一點,可以將if和else語句用{}括起來,可以避免分號錯誤。
  使用do{….}while(0)把它包裹起來,成為一個獨立的語法單元,從而不會與上下文發(fā)生混淆。同時因為絕大多數(shù)的編譯器都能夠識別do{…}while(0)這種無用的循環(huán)并進行優(yōu)化,所以使用這種方法也不會導致程序的性能降低
  4、測試程序
  簡單寫個測試程序,加強練習,熟悉一下宏的高級用法。
  1 #include <stdio.h>
  2
  3 #define PRINT1(a,b)        \
  4     {                  \
  5       printf("print a\n"); \
  6       printf("print b\n"); \
  7     }
  8
  9 #define      PRINT2(a, b)      \
  10   do{               \
  11       printf("print a\n"); \
  12       printf("print b\n"); \
  13     }while(0)
  14
  15 #define PRINT(a) \
  16     do{\
  17     printf("%s: %d\n",#a,a);\
  18     printf("%d: %d\n",a,a);\
  19     }while(0)
  20
  21 #define TYPE1(type,name)   type name_##type##_type
  22 #define TYPE2(type,name)   type name##_##type##_type
  23
  24 #define ERROR_LOG(module)   fprintf(stderr,"error: "#module"\n")
  25
  26  main()
  27 {
  28     int a = 20;
  29     int b = 19;
  30     TYPE1(int, c);
  31     ERROR_LOG("add");
  32     name_int_type = a;
  33     TYPE2(int, d);
  34     d_int_type = a;
  35
  36     PRINT(a);
  37     if (a > b)
  38     {
  39     PRINT1(a, b);
  40     }
  41     else
  42     {
  43     PRINT2(a, b);
  44     }
  45     return 0;
  46 }

c語言宏的用法

C語言程序中廣泛的使用宏定義,采用關鍵字define進行定義,宏只是一種簡單的字符串替換,根據(jù)是否帶參數(shù)分為無參和帶參。宏的簡單應用很容易掌握,下面小編就跟大家分享下c語言宏的用法。 1.宏的基本構成 (1)宏中包含特殊符號:#、##.
推薦度:
點擊下載文檔文檔為doc格式
515194