宏定义使用技巧

  • 防止一个头文件被重复包含
#ifndef MAIN_H
#define MAIN_H
//头文件包含
#endif
  • 得到指定地址上的一个字节或字
#define MEM_8(x) (*((uint8_t *)(x)))
#define MEM_32(x) (*((uint32_t *)(x)))
  • 求最大值和最小值
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MIN(x,y) (((x)<(y))?(x):(y))
  • 获取结构体type中memb成员相对于该结构体首元素地址的偏移量
#define offset_of(type, memb) \
        ((unsigned long)(&((type *)0)->memb))
  • 获取结构体type中memb成员的字节数
#define sizeof_st(type,memb) zizeof( ((type *)0)->member )
  • 给定结构体type中member成员的地址ptr、该结构体类型type和该成员的名字member获取member成员所在的结构体变量的首地址。
#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})
  • 得到一个变量的地址
#define PTR_8(var) ((uint8_t *)(void *)&(var))
#defien PTR_32(var) ((uint32_t *)(void *)&(var))
  • 对于IO空间映射在存储空间的结构,输入输出处理
#define inp32(port) (*((volatile uint32_t *)(port)))//获取port地址的值
#define outp32(port,val) (*((volatile uint32_t *)(port)))=((uint32_t)(val))//向port地址写入val值
  • 将寄存器组定义为结构体
typedef struct
{
  __IO uint32_t CR;
  __IO uint32_t CFGR;
  ...
} RCC_TypeDef;

#define RCC                 ((RCC_TypeDef *)RCC_BASE)
  • 判断函数参数是否合法
#define IS_TIM_INSTANCE(INSTANCE)\
  (((INSTANCE) == TIM1)    || \
   ((INSTANCE) == TIM2)    || \
   ((INSTANCE) == TIM3)    || \
   ((INSTANCE) == TIM4))
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
  • 当程序中的多个函数的函数体中只有少部分差异时
#define FUNC(name,x)\
int name##x()\
{\
    a##x=x;\
    return a##x;\
}

FUNC(func,1)//定义函数func1
FUNC(func,2)//定义函数func2
  •  linux内核链表list.h
  •  使用一些宏跟踪调试

__FILE__(打印函数名)、__LINE__(打印所在行)、__DATA__(打印源文件被翻译到代码时的日期)、__TIME__(打印源文件被翻译到代码时的时间)、__STDC__(如果实现是标准的,则宏__STDC__含有十进制常量1;如果它含有任何其它数,则实现是非标准的)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值