#define又称宏定义,标识符为所定义的宏名,简称宏。
一般用法
用法1
#define PI 3.14159
使用宏定义使得PI能够代表3.1415926,方便程序的编写。
用法2
#define max(x,y) (x)>(y)?(x):(y)
使用这种办法能够快速获取x、y中的最大值。
用法3
#define pin (int*)
使用这种办法可以使用pin代替(int*),进行指针的定义。
用法4
#define Conn(x,y) x##y
这种用法可以将x、y连接起来,例如
int n = Conn(123,456); 结果就是n=123456;
char* str = Conn("asdf","adf")结果就是 str = "asdfadf";
用法5
#define ToChar(x) #@x
这种用法可以给x加上单引号,转换成字符(不是字符串)。例如
char a = ToChar(1);
用法6
#define ToString(x) #x
这种用法是将x转换成字符串。例如
char* str = ToString(123132);
快捷指令
1.返回一个比X大的最接近的8的倍数
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
2. 将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
3. 返回数组元素的个数
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
特殊用法
1. 为了不重复书写枚举名称与对应的枚举字符串(#+枚举名称),进一步使用宏定义的方式,只定义一次状态,然后通过下面两条宏定义,实现对枚举项和枚举项对应的字符串的分别获取。(参考博主:码农爱学习)
#define ENUM_ITEM(ITEM) ITEM,
#define ENUM_STRING(ITEM) #ITEM
#define KEY_STATUS_ENUM(STATUS) \
STATUS(KS_RELEASE) /*稳定松开状态*/ \
STATUS(KS_PRESS_SHAKE) /*按下抖动状态*/ \
STATUS(KS_PRESS) /*稳定按下状态*/ \
STATUS(KS_RELEASE_SHAKE) /*松开抖动状态*/ \
STATUS(KS_NUM) /*状态总数(无效状态)*/ \
typedef enum
{
KEY_STATUS_ENUM(ENUM_ITEM)
}KEY_STATUS;
const char* key_status_name[] = {
KEY_STATUS_ENUM(ENUM_STRING)
};
2.实现在.h文件里面定义变量
//在main.c文件最上面添加
#define OS_GLOBALS
//在.h文件中添加
#ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif
//定义
OS_EXT int csj;