你是真的“C”——宏与函数的英雄本色

简介: 一、何为宏?在进行宏和函数的对比时,我们先了解一下什么是宏。#define 定义宏#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。下面是宏的申明方式:#define name( parament-list ) stuff其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中

微信图片_20230427214238.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

微信图片_20230427160707.gif


前言🙌


   哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享你是真的“C”——宏与函数的英雄本色。都是精华内容,可不要错过哟!!!😍😍😍


一、何为宏?


在进行宏和函数的对比时,我们先了解一下什么是宏。


#define 定义宏


#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。

下面是宏的申明方式:

#define name( parament-list ) stuff

其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。


注意:

  • 参数列表的左括号必须与name紧邻。
  • 如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。

举个栗子:

#define SQUARE( x ) x * x


二、宏和函数的对比: 😊


属性 #define定义宏 函数
代码长度 每次使用时,宏代码都会被插入到程序中。除了非常小的宏之外,程序的长度会大幅度增长 函数代码只出现于一个地方;每次使用这个函数时,都调用那个地方的同一份代码
执行速度 更快 存在函数的调用和返回的额外开销,所以相对慢一些
操作符优先级 宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否则邻近操作符的优先级可能会产生不可预料的后果,所以建议宏在书写的时候多些括号。 函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测
带有副作用的参数 参数可能被替换到宏体中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果 函数参数只在传参的时候求值一次,结果更容易控制
参数类型 宏的参数与类型无关,只要对参数的操作是合法的,它就可以使用于任何参数类型 函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数,即使他们执行的任务是相同的。
调试 宏是不方便调试的 函数是可以逐语句调试的
递归 宏是不能递归的 函数是可以递归的
数据类型作为参数 宏可以让类型作为参数 函数不能将类型作为参数


三、 #undef


这条指令用于移除一个宏定义。

#undef NAME
//如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除。


总结撒花💞


本篇文章旨在分享宏与函数的对比的相关知识点。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘


相关文章
|
11月前
|
机器学习/深度学习 算法 调度
基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率
该程序基于ACO蚁群优化算法解决VRPSD问题,使用MATLAB2022a实现,输出优化收敛曲线及路径规划结果。ACO通过模拟蚂蚁寻找食物的行为,利用信息素和启发式信息指导搜索,有效求解带时间窗约束的车辆路径问题,最小化总行程成本。
|
9月前
|
存储 SQL 人工智能
Lindorm:AI和具身智能时代的海量多模数据服务
本次分享由阿里云资深技术专家沈春辉介绍Lindorm数据库在AI和具身智能时代的应用。Lindorm定位于提供海量多模数据服务,融合了结构化、半结构化及非结构化数据的处理能力,支持时序、地理位置、文本、向量等多种数据类型。其核心特点包括多模一体化、云原生分布式架构、异步攒批写入、冷热数据分离、深度压缩优化、丰富索引和Serverless计算等,旨在提升研发效率并降低成本。Lindorm已广泛应用于车联网领域,覆盖60%国内头部车企,支撑近百PB数据规模,带来90%业务成本下降。
|
缓存 数据库 UED
SSR 服务器端渲染:提升用户体验的新趋势(下)
SSR 服务器端渲染:提升用户体验的新趋势(下)
SSR 服务器端渲染:提升用户体验的新趋势(下)
|
存储 Java 数据库
数据库设计方法论 - 继承
数据库设计方法论 - 继承
235 0
|
监控 微服务
SpringCloud - Hystrix(三)
SpringCloud - Hystrix(三)
129 0
SpringCloud - Hystrix(三)
消息转发流程分析
1. 先来看下动态方法决议的分析;2. 通过instrumentObjcMessageSends来辅助分析;3. 有关反汇编;
238 0
消息转发流程分析
|
监控 Java Unix
小师妹学JavaIO之:文件系统和WatchService
小师妹学JavaIO之:文件系统和WatchService
小师妹学JavaIO之:文件系统和WatchService
|
前端开发
#私藏项目实操分享# 【React工作记录十五】关于ant design中input限制加空格的问题
#私藏项目实操分享# 【React工作记录十五】关于ant design中input限制加空格的问题
261 0
#私藏项目实操分享# 【React工作记录十五】关于ant design中input限制加空格的问题
|
数据挖掘 数据库
Nat. Aging︱老药新用发现——西地那非有助于预防或治疗老年痴呆
Nat. Aging︱老药新用发现——西地那非有助于预防或治疗老年痴呆
610 0
Nat. Aging︱老药新用发现——西地那非有助于预防或治疗老年痴呆
|
容器 Perl Kubernetes
从零开始入门 K8s | 应用配置管理
一、需求来源 背景问题 首先一起来看一下需求来源。大家应该都有过这样的经验,就是用一个容器镜像来启动一个 container。要启动这个容器,其实有很多需要配套的问题待解决: 第一,比如说一些可变的配置。