宏定义提高代码的可移植性和可读性,在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义。那么究竟是用函数好,还是宏定义好?需要在开发中进行取舍。

宏定义和宏展开

为什么使用宏
  1. 防止头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //... #endif
  2. 条件编译 #ifdef DEBUG //... #else //... #endif
  3. 重新定义一些类型,用于跨平台编程,防止不同平台数据类型字节数不同的问题

    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 */
    
    #和##运算符
  4. 使用#来将参数变为字符串,在一个宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组

  5. “##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。 ``` #define TYPE1(type,name) type name_##type##type #define TYPE2(type,name) type name####type##_type

TYPE1(int,a): name_int_type TYPE2(int,a): a_int_type

```

常用的三种宏定义
  1. 使用“#”
  2. 使用“##”
  3. 使用“do{ }while(0)”: 可以避免分号错误
typedef与define区别
  1. typedef是编译阶段处理,define是预处理阶段
  2. typedef是类型的别名,#define是替换
  3. typedef可以定义一些通用类型跨平台的类型
参考
  1. 宏定义的黑魔法 - 宏菜鸟起飞手册
  2. 详解宏定义(#define)
  3. C语言宏高级用法
  4. 详解C语言中的宏定义