C语言学习笔记03--预处理相关

宏定义是简单的字符串替换, 是在预处理时完成的;而typedef是在编译时处理的,它不是做简单的替换,而是对类型说明符进行重新的命名,被命名的标识符具有类型定义说明的功能。

#define M_GetByteLL(x)                    (INT8U)((x) & 0xFF)
#define M_GetByteLH(x)                    (INT8U)(((x) >> 8) & 0xFF)
#define M_GetByteHL(x)                    (INT8U)(((x) >>16) & 0xFF)
#define M_GetByteHH(x)                    (INT8U)(((x) >>24) & 0xFF)

#define M_GetByteLo(x)                    (UINT8)((x) & 0xFF)
#define M_GetByteHi(x)                    (UINT8)(((x) >> 8) & 0xFF)
#define M_GetWordLO(x)                    (INT16U)((x) & 0xFFFF)
#define M_GetWordHI(x)                    (INT16U)(((x) >>16) & 0xFFFF)
#define M_MakeWord(l, h)                  ((((INT16U)(h)) << 8 ) | ((INT16U)(l) & 0xFF) )
#define M_MakeDWord(l, h)                   ((l)&0xFFFF) | (((h)&0xFFFF)<<16)

#define M_HexToBcd(x)                    ((((x) / 10) <<4) + ((x) % 10))
#define M_BcdToHex(x)                    ((((x) & 0xF0) >>4) * 10 + ((x) & 0x0F) )
#define M_SET_BIT(x, n)                  ((x) = (x) | (1<<(n)))
#define M_CLR_BIT(x, n)                  ((x) = (x) & (~(1<<(n))))
#define M_GET_BIT(x, n)                  ((x) & (1<<(n)))           // 注意:不赋值

#define M_AddrAlign4(Addr)                (((Addr) & 0xFFFFFFFC) + 4)   // 强制地址4字节对齐
#define M_Swap(a, b, tmp)                 do{(tmp)=(a); (a)=(b); (b)=tmp;}while(0)
#define M_MAX(x, y)                       (((x)>(y)) ? (x) : (y))
#define M_MIN(x, y)                       (((x)<(y)) ? (x) : (y))
// 字和字节联合体数据结构
typedef union
{
    UINT16              wWord;                                  // 字
    SINT16              nInt16;                                 // 有符号字
    UINT8               cByte[2];                               // 字节(配合CN_BYTE_LL等使用)
}tagWord_Byte2;

// 双字、字和字节联合体数据结构
typedef union
{
    FLOAT32             fData;                                  // 浮点
    UINT32              dwDword;                                // 双字
    SINT32              iInt32;                                 // 有符号双字
    UINT16              wWord[2];                               // 字  (配合CN_WORD_LO等使用)
    UINT8               cByte[4];                               // 字节(配合CN_BYTE_LL等使用)
}tagDWord_Byte4;

// 双字、字和字节联合体数据结构
typedef union
{
    UINT32              dwDword[2];                             // 双字
    UINT16              wWord[4];                               // 字  (配合CN_WORD_LO等使用)
    UINT8               cByte[8];                               // 字节(配合CN_BYTE_LL等使用)
}tagDWord_Byte8;

#运算符与##运算符

我们平时使用的带参宏时,字符串中的宏参数是没有被替换的。

#include <stdio.h>

#define ADD(A, B) printf(#A " + " #B " = %d\n", ((A) + (B)))

int main(void)
{
    ADD(5, 20);
    ADD(13, 14);
    return 0;
}
#include <stdio.h>

#define XNAME(n) x ## n
#define PRINT_XN(n) printf("x" #n " = %d\n", x ## n)

int main(void)
{
    int XNAME(1) = 14;
    int XNAME(2) = 20;
    PRINT_XN(1);
    PRINT_XN(2);
    return 0;
}
#define __STM32_PIN(index, gpio, gpio_index) \
{ \
index, GPIO##gpio##_CLK_ENABLE, GPIO##gpio, GPIO_PIN_##gpio_index \
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值