宏定义2

一、带参宏和带参函数的区别(宏定义的缺陷)

  • 宏定义在预处理期间处理,函数是在编译期间处理。
  • 宏定义最终在调用宏的地方把宏体原地展开,而函数是在调用函数处跳转到函数中执行,执行完后再跳转回来。
  • 宏定义是展开没有调用开销,函数有调用开销。
  • 当函数体只有一句话时可以用宏定义替代,这样效率高。
  • 宏定义不会检查参数的类型,返回值也不会附带类型。函数有明确的参数类型和返回类型,当调用函数时编译器会帮我们做静态的类型检查,当发现实际传参和声明的类型不同时会报错。
  • 用函数时不用太担心类型不匹配,编译器会检查。但用宏时要注意类型一致,因为编译器不会报错,运行就会直接出现错误。
  • 宏和函数各有千秋,如果代码比较多,比较适合用函数。对与只有一两句话的函数(开销大)适合用带参宏。但宏有缺点:不检查参数类型。
#include 
#define MAX(a,b) (((a)>(b))?(a):(b))
int max(int a,int b)
{
        if (a>b)
                return a;
        else
                return b;
}
int main(void)
{
        int a=3,b=5,c=0,d=0;
        c=MAX(a,b);
        printf("c=%d.\n,c");
        d=max(a,b);
        printf("d=%d.\n,c");
        return 0;
}

二、内联函数和inline关键字

  • 内联函数:通过在函数定义前加inline关键字实现。
  • 内联函数本质上是函数,有函数的优点(内联函数由编译器负责处理);同时又有带参宏不用调用开销原地展开的优点。
  • 可以把内联函数看作是带来参数静态参数类型检查的宏。
  • 当函数体很短,我们又利用编译器的参数类型检查来排错,还希望没有调用开销。此时最适合使用内联函数。

三、宏定义来实现条件编译

  • 程序由DEBUG和RELEASE版本,两种区别是编译时有无定义DEBUG宏,DEBUG版本可以用来做调试,RELEASE版本没有调试过程提高运行效率。
#include 
#define DEBUG
#undef DEBUG    //注销前面定义的宏
#ifdef DEBUG
#define debug(x) printf(x)
#else
#define debug(x) 
#endif
int main(void)
{
        debug("this is debug info.\n");        
}

你可能感兴趣的:(宏定义2)