查看原文
其他

#define的高级用法

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记!

往期资料  == 菜单栏下有更多资料

资源分享 | 嵌入式相关

资源分享 | 编程语言类

资源分享 | Linux相关资料

资源分享 | 数据结构与算法



原文:

https://blog.csdn.net/xiaoxu2050/article/details/82893476


#define的高级用法

一、宏的定义与撤销


需要注意的是:

(1)宏定义应注意添加括号,这样语义会比较清晰。

(2)使用#undef可以撤销宏定义。

(3)引号中的宏定义不会被替换。

(4)宏定义的宏名必须是合法的标识符。

(5)宏定义中单、双引号必须成对出现。


二、带有参数的宏定义

需要注意的是:

(1)宏调用时参数的个数要与定义时相同。


三、跨行的宏定义,使用反斜杠 \ 分隔


四、三个特殊符号:#,##,#@

五、常见的宏定义

1、防止头文件被重复包含


2、得到指定地址上的一个字节值或字值


3、得到一个field在结构体(struct)中的偏移量

#define OFFSETOF( type, field ) ( (size_t) &(( type *) 0)-> field )


4、得到一个结构体中field所占用的字节数 

#define FSIZ( type, field ) sizeof( ((type *) 0)->field )


5、得到一个变量的地址(word宽度) 

#define B_PTR(var) ( (byte *) (void *) &(var) ) 
#define W_PTR(var) ( (word *) (void *) &(var) )


6、将一个字母转换为大写

#define UPCASE(c) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )


7、判断字符是不是10进值的数字

#define DECCHK(c) ((c) >= '0' && (c) <= '9')


8、判断字符是不是16进值的数字

#define HEXCHK(c) (((c) >= '0' && (c) <= '9') ||((c) >= 'A' && (c) <= 'F') ||((c) >= 'a' && (c) <= 'f'))


9、防止溢出的一个方法

#define INC_SAT(val) (val = ((val)+1 > (val)) ? (val)+1 : (val))


10、返回数组元素的个数 

#define ARR_SIZE(a) ( sizeof((a)) / sizeof((a[0])) )


ps:资料链接失效怎么办?


温馨提示:若链接失效,请联系小编。小编微信及QQ二维码如下,欢迎添加


      
  


【往期精彩笔记推荐】

【C语言笔记】指定初始化器

学习使用带参宏,提高编程基础(一)

一位大牛的单片机笔记

你的老师让你做个计算器?

【C语言笔记】你知道C语言编译的过程吗?

【C语言笔记】操作位的技巧

【C语言笔记】位域

【C语言笔记】结构体


如果觉得对你有用的话,请帮忙点个赞哟,如果你觉得对你的朋友、同学也有用的话,欢迎转发给你的朋友。


Today's Feelings

点击左下角的【阅读全文】,获取本公众号往期所有笔记推送,欢迎一起交流,共同进步

你点的每个好看,我都认真当成了喜欢

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存