乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C語言宏定義技巧(常用宏定義)

       冉亮 2010-09-11
       
       
      寫好C語言,漂亮的宏定義很重要,使用宏定義可以防止出錯(cuò),提高可移植性,可讀性,方便性 等等。下面列舉一些成熟軟件中常用得宏定義。。。。。。
      1,防止一個(gè)頭文件被重復(fù)包含

      #ifndef COMDEF_H

      #define COMDEF_H

        //頭文件內(nèi)容

      #endif

      2,重新定義一些類型,防止由于各種平臺(tái)和編譯器的不同,而產(chǎn)生的類型字節(jié)數(shù)差異,方便移植。

      typedef  unsigned char      boolean;     /* Boolean value type. */

       

      typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */

      typedef  unsigned short     uint16;      /* Unsigned 16 bit value */

      typedef  unsigned char      uint8;       /* Unsigned 8  bit value */

       

      typedef  signed long int    int32;       /* Signed 32 bit value */

      typedef  signed short       int16;       /* Signed 16 bit value */

      typedef  signed char        int8;        /* Signed 8  bit value */

       

       

      //下面的不建議使用

      typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */

      typedef  unsigned short    word;         /* Unsinged 16 bit value type. */

      typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */

       

      typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */

      typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */

      typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */

       

      typedef  signed char       int1;         /* Signed 8  bit value type. */

      typedef  signed short      int2;         /* Signed 16 bit value type. */

      typedef  long int          int4;         /* Signed 32 bit value type. */

       

      typedef  signed long       sint31;       /* Signed 32 bit value */

      typedef  signed short      sint15;       /* Signed 16 bit value */

      typedef  signed char       sint7;        /* Signed 8  bit value */

       

      3,得到指定地址上的一個(gè)字節(jié)或字

      #define  MEM_B( x )  ( *( (byte *) (x) ) )

      #define  MEM_W( x )  ( *( (word *) (x) ) )

      4,求最大值和最小值

         #define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

         #define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

      5,得到一個(gè)field在結(jié)構(gòu)體(struct)中的偏移量

      #define FPOS( type, field ) \

      /*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

      6,得到一個(gè)結(jié)構(gòu)體中field所占用的字節(jié)數(shù)

      #define FSIZ( type, field ) sizeof( ((type *) 0)->field )

      7,按照LSB格式把兩個(gè)字節(jié)轉(zhuǎn)化為一個(gè)Word

      #define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

      8,按照LSB格式把一個(gè)Word轉(zhuǎn)化為兩個(gè)字節(jié)

      #define  FLOPW( ray, val ) \

        (ray)[0] = ((val) / 256); \

        (ray)[1] = ((val) & 0xFF)

      9,得到一個(gè)變量的地址(word寬度)

      #define  B_PTR( var )  ( (byte *) (void *) &(var) )

      #define  W_PTR( var )  ( (word *) (void *) &(var) )

      10,得到一個(gè)字的高位和低位字節(jié)

      #define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))

      #define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

      11,返回一個(gè)比X大的最接近的8的倍數(shù)

      #define RND8( x )       ((((x) + 7) / 8 ) * 8 )

      12,將一個(gè)字母轉(zhuǎn)換為大寫

      #define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

      13,判斷字符是不是10進(jìn)值的數(shù)字

      #define  DECCHK( c ) ((c) >= '0' && (c) <= '9')

      14,判斷字符是不是16進(jìn)值的數(shù)字

      #define  HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\

                             ((c) >= 'A' && (c) <= 'F') ||\

      ((c) >= 'a' && (c) <= 'f') )

      15,防止溢出的一個(gè)方法

      #define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))

      16,返回?cái)?shù)組元素的個(gè)數(shù)

      #define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )

      17,返回一個(gè)無符號(hào)數(shù)n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

      #define MOD_BY_POWER_OF_TWO( val, mod_by ) \

                 ( (dword)(val) & (dword)((mod_by)-1) )

      18,對(duì)于IO空間映射在存儲(chǔ)空間的結(jié)構(gòu),輸入輸出處理

        #define inp(port)         (*((volatile byte *) (port)))

        #define inpw(port)        (*((volatile word *) (port)))

        #define inpdw(port)       (*((volatile dword *)(port)))

        

        #define outp(port, val)   (*((volatile byte *) (port)) = ((byte) (val)))

        #define outpw(port, val)  (*((volatile word *) (port)) = ((word) (val)))

        #define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

      [2005-9-9添加] 

      19,使用一些宏跟蹤調(diào)試

      A N S I標(biāo)準(zhǔn)說明了五個(gè)預(yù)定義的宏名。它們是:

      _ L I N E _

      _ F I L E _

      _ D A T E _

      _ T I M E _

      _ S T D C _

      如果編譯不是標(biāo)準(zhǔn)的,則可能僅支持以上宏名中的幾個(gè),或根本不支持。記住編譯程序

      也許還提供其它預(yù)定義的宏名。

      _ L I N E _及_ F I L E _宏指令在有關(guān)# l i n e的部分中已討論,這里討論其余的宏名。

      _ D AT E _宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時(shí)的日期。

      源代碼翻譯到目標(biāo)代碼的時(shí)間作為串包含在_ T I M E _中。串形式為時(shí):分:秒。

      如果實(shí)現(xiàn)是標(biāo)準(zhǔn)的,則宏_ S T D C _含有十進(jìn)制常量1。如果它含有任何其它數(shù),則實(shí)現(xiàn)是

      非標(biāo)準(zhǔn)的。

      可以定義宏,例如:

      當(dāng)定義了_DEBUG,輸出數(shù)據(jù)信息和所在文件所在行

      #ifdef _DEBUG

      #define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)

      #else

            #define DEBUGMSG(msg,date) 

      #endif

       

      20,宏定義防止使用是錯(cuò)誤

      用小括號(hào)包含。

      例如:#define ADD(a,b) (a+b)

      用do{}while(0)語句包含多語句防止錯(cuò)誤

      例如:#difne DO(a,b) a+b;\

                         a++;

      應(yīng)用時(shí):if(….)

                DO(a,b); //產(chǎn)生錯(cuò)誤

              else

              

      解決方法: #difne DO(a,b) do{a+b;\

                         a++;}while(0)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多