内联函数与宏定义的区别

内联函数与宏的区别:

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

1 防止一个头文件被重复包含 
#ifndef BODYDEF_H 
#define BODYDEF_H 
#endif
 
2 得到指定地址上的一个字节或字
 
  1. #define MEM_B( x ) ( *( (byte *) (x) ) ) 
  2. #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 返回数组元素的个数 
  1. #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

     

posted @ 2015-07-09 18:00  Rosanne  阅读(2162)  评论(0编辑  收藏  举报