内联函数与宏的区别:

  •  内联函数与普通函数相比,可以加快程序的运行速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中。而宏只是简单的字符替换。
  • 内联函数要做参数类型检查,这是内联函数跟宏相比的优势。
 inline一般只用于如下情况:
    (1)一个函数不断被重复调用
    (2)函数只有简单的几行,且不包含for、while、switch等语句。
    一般而言,写小程序没有必要使用inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,应考虑使用inline
 
常用的一些宏定义

1 防止一个头文件被重复包含 
#ifndef BODYDEF_H 
#define BODYDEF_H 
#endif
 
2 得到指定地址上的一个字节或字
 
  • #define MEM_B( x ) ( *( (byte *) (x) ) ) 
  • #define MEM_W( x ) ( *( (word *) (x) ) )
  • 用法如下:
    #include <iostream>
    #include <windows.h>
    #define MEM_B(x) (*((byte*)(x)))
    #define MEM_W(x) (*((WORD*)(x)))
    int main()
    {
        int bTest = 0x123456;
        byte m = MEM_B((&bTest));/*m=0x56*/
        int n = MEM_W((&bTest));/*n=0x3456*/
        return 0;
    }

    3 得到一个field在结构体(struct)中的偏移量
     
    #define OFFSETOF( type, field ) ( (size_t) &(( type *) 0)-> field )

    4 得到一个结构体中field所占用的字节数 
    #define FSIZ( type, field ) sizeof( ((type *) 0)->field )

    5 得到一个变量的地址(word宽度) 
    #define B_PTR( var ) ( (byte *) (void *) &(var) ) 
    #define W_PTR( var ) ( (word *) (void *) &(var) )
    6 将一个字母转换为大写
    #define UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )

     

    7 判断字符是不是10进值的数字

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

     

    8 判断字符是不是16进值的数字 
    #define HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''A'' && (c) <= ''F'') ||((c) >= ''a'' && (c) <= ''f'') )

     

    9 防止溢出的一个方法
     
    #define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

     

    10 返回数组元素的个数 
  • #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

     

  • 相关文章: