0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

#define的高级用法简介

黄工的嵌入式威廉希尔官方网站 圈 来源:黄工的嵌入式威廉希尔官方网站 圈 作者:黄工的嵌入式威廉希尔官方网站 2020-02-05 11:50 次阅读

来源:嵌入式大杂烩

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

一、宏的定义与撤销

需要注意的是:

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

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

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

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

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

二、带有参数的宏定义

需要注意的是:

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

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

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

五、常见的宏定义

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

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

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

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

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

#defineFSIZ(type,field)sizeof(((type*)0)->field)

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

#defineB_PTR(var)((byte*)(void*)&(var)) #defineW_PTR(var)((word*)(void*)&(var))

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

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

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

#defineDECCHK(c)((c)>='0'&&(c)<= '9')

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

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

9、防止溢出的一个方法

#defineINC_SAT(val)(val=((val)+1>(val))?(val)+1:(val))

10、返回数组元素的个数

#defineARR_SIZE(a)(sizeof((a))/sizeof((a[0])))

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19115

    浏览量

    304926
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136740
收藏 人收藏

    评论

    相关推荐

    DAC7562的CLR引脚怎么用法?可以悬空吗?

    DAC7562的CLR引脚怎么用法?可以悬空吗?能不能详细解释一下?谢谢
    发表于 12-17 08:16

    PCB高级EMC设计

    PCB高级EMC设计  
    的头像 发表于 11-16 11:28 1134次阅读
    PCB<b class='flag-5'>高级</b>EMC设计

    Linux lsof命令的基本用法

    在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。
    的头像 发表于 10-23 11:52 247次阅读
    Linux lsof命令的基本<b class='flag-5'>用法</b>

    SV中define宏定义的用法

    SV中使用预处理指令`define来定义宏,宏可以用来创建文本替换。根据场景不同,`define主要用来定义常量、简化复杂的表达式或代码段以及提高代码的可移植性。其基本语法为:
    的头像 发表于 10-21 14:22 564次阅读

    共模电感的用法

    呈现出大电感,具有抑制作用,而对于差模信号则呈现出很小的漏电感,几乎不起作用。以下是对共模电感用法的详细探讨。
    的头像 发表于 10-17 15:12 585次阅读

    安达发|APS高级排程高级物料需求计划

    APS高级排程高级物料需求计划是在制造业中非常重要的概念。它们分别涉及到生产计划和物料管理,对于提高生产效率、降低成本和满足客户需求具有重要意义。下面我将详细介绍这两个概念及其在实际生产
    的头像 发表于 09-25 17:49 303次阅读
    安达发|APS<b class='flag-5'>高级</b>排程<b class='flag-5'>高级</b>物料需求计划

    Sn74hc245具体的用法是什么?

    Sn74hc245是缓冲器,但是具体的用法不会
    发表于 09-10 07:32

    鸿蒙Ability Kit(程序框架服务)【UIAbility组件基本用法

    UIAbility组件的基本用法包括:指定UIAbility的启动页面以及获取UIAbility的上下文[UIAbilityContext]。
    的头像 发表于 06-06 11:02 471次阅读
    鸿蒙Ability Kit(程序框架服务)【UIAbility组件基本<b class='flag-5'>用法</b>】

    C语言#define的应用

    在 C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏预处理器。
    发表于 03-06 11:29 376次阅读
    C语言#<b class='flag-5'>define</b>的应用

    AWTK 开源串口屏开发(10) - 告警信息的高级用法

    信息的显示和管理。本文介绍告警信息的两种高级用法:查询告警信息。如果告警信息比较多,我们需要通过查询,来快速找到我们想要的告警信息。查看告警信息的详情。如果某条告警
    的头像 发表于 02-24 08:23 307次阅读
    AWTK 开源串口屏开发(10) - 告警信息的<b class='flag-5'>高级</b><b class='flag-5'>用法</b>

    verilog inout用法与仿真

    ,本文将详细讨论 inout 的用法和仿真。 首先,我们来了解一下 inout 的含义。 inout 是一种双向信号类型,即可以作为输入信号也可以作为输出信号。它类似于双向数据线,可以实现数据的双向传输。在硬件设计中, inout 可以用于与外部设备进行通信,如键盘、鼠标、显
    的头像 发表于 02-23 10:15 3017次阅读

    verilog function函数的用法

    Verilog 中被广泛用于对电路进行模块化设计,以简化和组织代码。 本文将详细介绍 Verilog 函数的用法,并探讨函数在硬件设计中的重要性和实际应用场景。 一. Verilog 函数概述 Verilog 函数通过提供一种结构化的方式来组织代码,并可以根据需要重复使用。它们可以在模块内部或外部定义,
    的头像 发表于 02-22 15:49 5601次阅读

    法拉电容放电保护原理是什么?如何正常使用法拉电容?

    法拉电容放电保护原理是什么?如何正常使用法拉电容? 法拉电容放电保护原理是指通过合理的设计和配置,保护法拉电容在放电过程中不受损坏的一种威廉希尔官方网站 手段。法拉电容是一种具有高能量密度和长寿命的电容器
    的头像 发表于 02-02 11:34 1873次阅读

    单片机定时器的用法

    本章以CW32通用定时器为例介绍单片机定时器的用法
    的头像 发表于 01-04 10:37 1400次阅读
    单片机定时器的<b class='flag-5'>用法</b>

    LabVIEW SMO 的原理、用法和实际应用

    ) 实例同步运行并共享数据,从而能够实现高效的并行计算和更好的系统性能。在本文中,我们将详细介绍 LabVIEW SMO 的原理、用法和实际应用。 首先,我们需要了解 LabVIEW SMO 的基本原理
    的头像 发表于 12-27 16:47 2162次阅读