宏定义是简单的字符串替换, 是在预处理时完成的;而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 \
}