亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></div>
      學(xué)習(xí)啦>學(xué)習(xí)英語>專業(yè)英語>計(jì)算機(jī)英語>

      c語言宏的用法

      時(shí)間: 長思709 分享
        C語言程序中廣泛的使用宏定義,采用關(guān)鍵字define進(jìn)行定義,宏只是一種簡單的字符串替換,根據(jù)是否帶參數(shù)分為無參和帶參。宏的簡單應(yīng)用很容易掌握,下面小編就跟大家分享下c語言宏的用法。
        c語言宏的用法如下:
             1.宏的基本構(gòu)成
       ?。?)宏中包含特殊符號(hào):#、##.
        (2)宏定義用do{ }while(0)
        2、特殊符號(hào)#、##
        (1)#
        Whenyouputa#beforeanargumentinapreprocessor macro,thepreprocessorturnsthatargumentintoacharacterarray.
        在一個(gè)宏中的參數(shù)前面使用一個(gè)#,預(yù)處理器會(huì)把這個(gè)參數(shù)轉(zhuǎn)換為一個(gè)字符數(shù)組
        簡化理解:#是“字符串化”的意思,出現(xiàn)在宏定義中的#是把跟在后面的參數(shù)轉(zhuǎn)換成一個(gè)字符串
        #define ERROR_LOG(module)   fprintf(stderr,"error: "#module"\n")
        ERROR_LOG("add"); 轉(zhuǎn)換為 fprintf(stderr,"error: "add"\n");
        ERROR_LOG(devied =0); 轉(zhuǎn)換為 fprintf(stderr,"error: devied=0\n");
       ?。?)##
        “##”是一種分隔連接方式,它的作用是先分隔,然后進(jìn)行強(qiáng)制連接。
        在普通的宏定義中,預(yù)處理器一般把空格解釋成分段標(biāo)志,對于每一段和前面比較,相同的就被替換。但是這樣做的結(jié)果是,被替換段之間存在一些空格。如果我們不希望出現(xiàn)這些空格,就可以通過添加一些##來替代空格。
        1 #define TYPE1(type,name)   type name_##type##_type
        2 #define TYPE2(type,name)   type name##_##type##_type
        TYPE1(int, c);轉(zhuǎn)換為:int  name_int_type ; (因?yàn)?#號(hào)將后面分為 name_ 、type 、 _type三組,替換后強(qiáng)制連接)
        TYPE2(int, d);轉(zhuǎn)換為: int d_int_type ;(因?yàn)?#號(hào)將后面分為 name、_、type 、_type四組,替換后強(qiáng)制連接)
        3、宏定義中do{ }while(0)
        第一眼看到這樣的宏時(shí),覺得非常奇怪,為什么要用do……while(0)把宏定義的多條語句括起來?非常想知道這樣定義宏的好處是什么,于是google、百度一下了。
        采用這種方式是為了防范在使用宏過程中出現(xiàn)錯(cuò)誤,主要有如下幾點(diǎn):
        (1)空的宏定義避免warning:
        #define foo() do{}while(0)
       ?。?)存在一個(gè)獨(dú)立的block,可以用來進(jìn)行變量定義,進(jìn)行比較復(fù)雜的實(shí)現(xiàn)。
       ?。?)如果出現(xiàn)在判斷語句過后的宏,這樣可以保證作為一個(gè)整體來是實(shí)現(xiàn):
        #define foo(x) \
        action1(); \
        action2();
        在以下情況下:
        if(NULL == pPointer)
        foo();
        就會(huì)出現(xiàn)action1和action2不會(huì)同時(shí)被執(zhí)行的情況,而這顯然不是程序設(shè)計(jì)的目的。
        (4)以上的第3種情況用單獨(dú)的{}也可以實(shí)現(xiàn),但是為什么一定要一個(gè)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();
        在把宏引入代碼中,會(huì)多出一個(gè)分號(hào),從而會(huì)報(bào)錯(cuò)。這對這一點(diǎn),可以將if和else語句用{}括起來,可以避免分號(hào)錯(cuò)誤。
        使用do{….}while(0)把它包裹起來,成為一個(gè)獨(dú)立的語法單元,從而不會(huì)與上下文發(fā)生混淆。同時(shí)因?yàn)榻^大多數(shù)的編譯器都能夠識(shí)別do{…}while(0)這種無用的循環(huán)并進(jìn)行優(yōu)化,所以使用這種方法也不會(huì)導(dǎo)致程序的性能降低
        4、測試程序
        簡單寫個(gè)測試程序,加強(qiáng)練習(xí),熟悉一下宏的高級(jí)用法。
        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語言程序中廣泛的使用宏定義,采用關(guān)鍵字define進(jìn)行定義,宏只是一種簡單的字符串替換,根據(jù)是否帶參數(shù)分為無參和帶參。宏的簡單應(yīng)用很容易掌握,下面小編就跟大家分享下c語言宏的用法。 1.宏的基本構(gòu)成 (1)宏中包含特殊符號(hào):#、##.
      推薦度:
      點(diǎn)擊下載文檔文檔為doc格式
      515194