带参数的宏定义与有参函数的区别

2023-05-16

1、先介绍一下什么是宏定义

       宏定义属于C语言编译系统中编译预处理中的一部分(但编译预处理不是C语言的语句),其作用是为编译系统提供必要的前置信息,告诉编译系统在源程序进行编译之前应该做些什么。它有利于程序的模块化设计,提高代码效率,增加了程序的可读性,方便程序的调试和移植。

例如: 宏定义如下:#define   宏名   宏体

#define PI 3.1415926  /*用PI代表3.1415926*/
#define PR printf     /*用PR表示printf*/

一定是要定义完后才可使用,使用宏名可以有效减少程序中重复书写的某些宏体的工作量,其有效范围是从定义的位置到文件的结束。

 

2、带参数的宏定义

带参数的宏定义,即宏名后面可以带有形式参数,在宏体中包含宏名后面的参数。

一般形式为:#define    宏名(参数表)   宏体

#define L(X)(X)*(X)*(X)

 

3、区别

带参数的宏定义与有参函数很相似,使用的时候要注意两者的区别:

(1)函数调用要求实参和形参类型一致,如实参是表达式:必须先计算出值。,然后再传递给形参,宏体也无类型,宏展开只进行参数的简单替换。

(2)函数调用是在程序运行时处理,为形参分配临时的内存单元,可以有返回值:而宏展开是在编译前进行的,展开时并不为形参分配内存单元,不进行值的传递,没有返回值的概念

(3)调用函数最多得到一个返回值,而用宏定义可以设法得到多个值。

(4)宏展开会使源程序变长,而函数调用不会使源程序变长。

(5)宏替换不占运行时间:只占编译时间,而函数调用则占运行时间(分配存储空间,保国现场值传递、返回等)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带参数的宏定义与有参函数的区别 的相关文章

  • LiveNVR Onvif/RTSP流媒体软件接入监控摄像头后如何获取直播流地址进行大屏展示、播放端拉流、网页播放监控视频等...

    1 LiveNVR介绍 LiveNVR的安防监控的视频直播 xff0c 可以按标准的Onvif RTSP协议接入监控设备 xff0c 也可以通过海康 大华 天地伟业等厂家私有SDK接入监控 xff0c 实现web页面的播放和录像回放 可以分
  • GB28181国标平台LiveGBS视频统一汇聚后如何获取固定的播放地址,实现监控视频Web页面无插件播放、拉流分析、上大屏等目的...

    目前汇聚各种厂家监控设备的视频汇聚平台 xff0c 基本都是通过GB28181标准协议实现的 下面介绍下LiveGBS Web无插件直播的GB28181视频平台将各厂家 包括海康 大华 华为 宇视 天地伟业等 监控汇聚到同一个服务器上后 x
  • 解决 LiveQing 流媒体服务器videojs flash播放RTMP、HLS提示错误的问题

    问题 LiveQing流媒体服务器可以输出HTTP FLV Websocket FLV RTMP HLS流 xff0c 在做RTMP HLS flash播放时候 xff0c 经常会遇到网站flash被禁用的情况 xff0c 每一次都会有用户
  • webpack 混淆压缩 javascript 后端代码

    需求背景 JavaScript 是脚本语言 没有编译过程 直接以源码就可以运行 有的时候 出于安全或者其他的原因 我们不希望别人直接读到源码 或者很容易对源码做出修改使用 这个时候 就需要对源码进行混淆压缩处理 经过处理后的代码体积变小 不
  • VideoJS 网页直播实现默认静音

    在开发 LiveQing高性能流媒体服务器 网页直播多分屏的时候 产品提出议建说 能不能在多分屏的时候 默认静音状态 因为多分屏界面 如果声音打开 好多个直播画面同时发出声音太过嘈杂 体验不好 我表示赞同 心想 这个应该不难处理吧 结果踩到
  • VideoJS 网页直播实现双击全屏

    最近接到客户需求 要求我们的网页直播播放器更加符合广大人民群众的使用习惯 实现双击全屏的效果 目前网页直播播放器使用了开源的 VideoJS 它的默认效果是单击播放区域暂停 只能通过右下角的最大化按钮触发最大化 要实现双击全屏播放的效果 就
  • LivePlayer H5直播/点播播放器安装与使用

    LivePlayer H5播放器 简介 H5直播 点播播放器 xff0c 使用简单 xff0c 功能强大 xff0c 免费使用 支持m3u8播放 支持HTTP FLV播放 支持RTMP播放 支持直播和点播播放 支持播放器快照截图 支持点播多
  • Echarts 修改折线的颜色和折线的点的大小方法

    在做SPC分析的时候或者一些专业的分析的时候有的客户会要求 点的大小 样式等 具体的设置方法如下 series type 39 line 39 showSymbol true symbol 39 circle 39 设定为实心点 symbo
  • 抽象工厂模式

    抽象工厂模式针对的是对产品族 xff0c 而不是产品等级结构 产品族 xff1a 同一厂商生产的产品 产品等级 xff1a 同一产品 xff0c 不同厂商的产品 比如水果类里面由苹果和香蕉 xff0c 水果就是产品族 xff0c 苹果香蕉就
  • 面向对象单例模式

    单例模式 xff1a 一个类只能创建一个对象 span class token keyword class span span class token class name A span span class token punctuati
  • 设计模式之代理模式

    概念 xff1a 为其他对象提供一种代理 xff0c 用来控制对象的访问 在某些情况下 xff0c 一个对象不适合或不能直接引用另一个对象 xff0c 而代理对象可以在客户端和目标对象之间起到中介作用 span class token co
  • ARM接口技术基础

    ARM介绍 嵌入式系统 xff1a 嵌入式系统 61 嵌入式硬件 43 嵌入式软件 硬件是软件的载体 xff0c 软件是硬件的灵魂 嵌入式软件 xff1a 1 裸机 xff1a APP 2 系统 xff1a OS 43 APP 嵌入式硬件
  • ARM指令之MOV指令汇编与机器码的对应关系

    指令条件码 条件码就是一种简单的测试ALU状态标志位的方法 mov指令机器码 比如 xff1a mov r1 3 立即数 xff1a 3 第一个操作数 xff1a 寄存器1 S xff1a 0 xff08 注意 xff1a mov指令后面加
  • 设计模式之外观模式

    什么是外观模式 外观模式就是将一个复杂的子类系统抽象到同一个接口进行管理 外界只需要通过此接口与子类系统进行交互 xff0c 不需要直接与复杂的子类系统进行交互 外观模式属于结构型模式 外观模式案例 1 实现KTV模式 xff1a 打开电视
  • 设计模式之适配器模式

    概念 将一个类的接口转换成客户希望的另外一个接口 使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 用vector容器中的for each 举例子 span class token keyword class span span c
  • Qt基础学习笔记

    Qt中的常用快捷键 注释 xff1a ctrl 43 运行 xff1a ctrl 43 r 编译 xff1a ctrl 43 b 帮助文档 xff1a F1 自动对齐 xff1a ctrl 43 i 同名之间 h文件与 cpp文件的切换 x
  • Nginx学习 (1) —— 初识Nginx(编译安装、启动停止、简单配置)

    文章目录 Nginx的发行版本Nginx的编译安装 xff08 ubuntu18 04 xff09 Nginx相关操作Nginx启动停止命令安装Nginx为系统服务 Nginx的目录结构与基本原理目录结构 xff1a 基本运行原理 xff1
  • Nginx学习 (2) —— 虚拟主机配置

    文章目录 虚拟主机原理域名解析与泛域名解析 xff08 实践 xff09 配置文件中ServerName的匹配规则技术架构多用户二级域名短网址 虚拟主机原理 为什么需要虚拟主机 xff1a 当一台主机充当服务器给用户提供资源的时候 xff0
  • 如任让Echarts默认显示全部的数据(x轴(时间轴)默认显示查询到的所有数据)

    Echarts绘制折线图 有时候会用到时间轴 但是有时候时间轴默认显示的是部分数据 而不是全部的数据 当客户要求默认显示全部的数据的时候 就可以使用下面的方法 把dataZoom属性的startValue设置为0即可 dataZoom st
  • Nginx学习(3)—— 反向代理、负载均衡、动静分离、URLRewrite、防盗链

    文章目录 网关 代理与反向代理Nginx的反向代理配置基于反向代理的负载均衡的配置负载均衡策略负载均衡权重相关配置 xff08 weight xff09 动静分离Nginx配置动静分离 URL rewrite伪静态配置负载均衡 43 URL

随机推荐