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

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

3天内不再提示

C语言中的宏定义

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-09-28 16:05 次阅读

#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。

1.不带参数的宏定义:
宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define 标识符 字符串
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:
#define PI 3.1415926
把程序中出现的PI全部换成3.1415926
说明:
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义可以嵌套
(8)字符串" "中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
2.带参数的宏:
除了一般的字符串替换,还要做参数代换
格式:
#define 宏名(参数表) 字符串
例如:#define S(a,b) a*b
area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;
类似于函数调用,有一个哑实结合的过程:
(1)实参如果是表达式容易出问题
#define S(r) r*r
area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
正确的宏定义是#define S(r) (r)*(r)
(2)宏名和参数的括号间不能有空格
(3)宏替换只作替换,不做计算,不做表达式求解
(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
(5)宏的哑实结合不存在类型,也没有类型转换。
(6)函数只有一个返回值,利用宏则可以设法得到多个值
(7)宏展开使源程序变长,函数调用不会
(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

(1)简单的宏定义:#define<宏名><字符串>

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

(2)带参数的宏定义#define<宏名> (<参数表>)<宏体>

#defineMAX(a,b)((a)>(b)?(a):(b))

2、不能忽略宏定义中的空格

下面的宏定义中,f是否带了参数呢?

#definef(x)((x)+1)

答案是否定的,在f与(x)之间存在一个空格,导致变成了如下定义:

#define  f   (x)((x)+1)
poYBAGM0ADeACSuDAABCskHOT70774.png

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

    关注

    180

    文章

    7530

    浏览量

    128532
  • 宏定义
    +关注

    关注

    0

    文章

    48

    浏览量

    8927
收藏 人收藏

    评论

    相关推荐

    C语言中定义宏的用法和使用场景

    在C语言中,预定义宏是由编译器提供的一组特殊标识符,可以在程序中直接使用,无需进行额外的定义
    发表于 08-16 16:12 259次阅读

    C语言中定义的应用

    在C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
    发表于 08-17 15:33 388次阅读

    C语言中定义的使用技巧

    #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
    发表于 09-05 10:12 498次阅读
    C<b class='flag-5'>语言中</b>宏<b class='flag-5'>定义</b>的使用技巧

    让keil编辑器支持二进制数据

    了,在这里与大家分享一个简单的实现方法。就是利用C语言中定义#defineB0010_00000x20有了这样的
    发表于 05-02 19:10

    labview中有类似于c语言中定义

    如题,labview中有类似于c语言中定义吗 define xxx XXX。。。多谢~
    发表于 10-05 15:04

    c语言中定义是什么意思

    #define CLASS(type) \typedef struct type type; \struct type搞不清楚这个是什么意思。。。求解释。
    发表于 03-12 04:20

    #ifndef、#def、#endif使用方法

    详细介绍了C语言中定义的用法,条件编译,宏定义
    发表于 11-17 10:30 9次下载

    正则模型类的时态可定义

    正则模型是非正规模态逻辑的模型,通过定义正则模型的不相交并、C2t-互模拟、生成子模型、C2t-超滤扩张等模型上的运算,可以证明一个正则模型类在时态语言中定义当且仅当它在不相交并、满C2t-互模拟
    发表于 12-29 10:25 0次下载

    单片机C语言中变量的定义方法解析

    #pragma rambank0 ;即以关键词#pragma开始,rambank0指明资料区块为第0块。 unsigned char m_acc; ;定义一个无符号字符型变量m_acc
    发表于 09-29 16:26 8543次阅读

    汇总和深挖C语言中定义所有的知识点

    知识点在刚开始接触时,我感觉比较难懂、不好理解,那么以后不论我花多长时间去研究这个知识点,心里会一直认为该知识点比较难,也就是说第一印象特别的重要。 就比如 C 语言中的宏定义,好像跟我犯冲一样,我一直觉得宏定义是 C
    的头像 发表于 05-03 18:31 2409次阅读
    汇总和深挖C<b class='flag-5'>语言中</b>宏<b class='flag-5'>定义</b>所有的知识点

    C51 单片机的 C 语言中的变量定义与硬件之间的关系

    C51 语言的变量定义定义方式:普通变量:(修饰符)数据类型 [存储类型] 变量名 [= 值]指针变量: (修饰符)所指向的地址的数据类型 [所指向的地址的存储类型] *[指针的存储类型] 变量名
    发表于 11-23 16:51 3次下载
    C51 单片机的 C <b class='flag-5'>语言中</b>的变量<b class='flag-5'>定义</b>与硬件之间的关系

    c语言带参数的宏定义

    c语言带参数的宏定义  C语言定义是一种宏替换机制,它可以将一个标识符替换为一个代码片段。宏定义通常在程序中用来方便地进行常量
    的头像 发表于 09-04 17:45 1837次阅读

    c语言中数组怎么定义

    C语言中,数组是一种用来存储相同类型元素的数据结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据结构,可以用于解决很多实际的问题。 在C语言中定义数组的语法如下
    的头像 发表于 11-24 10:11 1076次阅读

    如何给C语言中的函数定义两个不同的名字?

    最近有位哥问我,如何给C语言中的函数定义两个不同的名字?就是这两个名字都是指向同一个函数,同一个地址,而且两个名字都可以当做函数来用的那种。
    的头像 发表于 12-19 16:21 315次阅读

    浅谈C语言中的函数定义

    如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。 形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
    发表于 03-11 10:09 117次阅读