深入理解C语言宏定义

目录

一、前言

二、宏的相关语法

2.1 #define

2.2 #undef

2.3 #运算符

2.4 ##运算符

三、宏替换的规则

四、宏与函数


一、前言

        我们都知道#define语句可以定义常量,在编译器预处理时会全部将名字替换为常量。与此同时,#define也允许把参数替换到文本中,这就是本文要重点介绍的宏定义。

二、宏的相关语法

2.1 #define

//语法定义
#define name( parament-list ) stuff
//使用举例
#define DOUBLE(x) (x) + (x)
int main()
{int a = DOUBLE(2);return 0;
}

2.2 #undef

//用于移除已定义的宏
#undef NAME

2.3 #运算符

  1. 功能:#运算符将宏的⼀个参数转换为字符串字⾯量
  2. 引入:字符串中的n没有被替换
    #define PRINT(n,format) printf("the value of n is "format"\n",n)int main()
    {int a = 8;PRINT(a,"%d");int b = 69;PRINT(b,"%d");float c = 6.6f;PRINT(c,"%f");return 0;
    }

  3. 修改:
    #include <stdio.h>#define PRINT(n,format) printf("the value of "#n " ""is "format"\n",n)int main()
    {int a = 8;PRINT(a,"%d");int b = 69;PRINT(b,"%d");float c = 6.6f;PRINT(c,"%f");return 0;
    }

2.4 ##运算符

  1. 功能:##可以把位于它两边的符号合成⼀个符号
  2. 代码示例:
    #define GENERATED_MAX(type) \type type##_max(type x , type y)   \{	\return x>y?x:y;	 \}//定义函数
    GENERATED_MAX(int);    
    GENERATED_MAX(float);int main()
    {int a = int_max(3, 5);printf("%d\n", a);float b = float_max(3.5, 6.7);printf("%.2f\n", b);return 0;
    }

三、宏替换的规则

  1. 在调⽤宏时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
  2. 替换⽂本随后被插⼊到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
  3. 最后,再次对结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上 述处理过程。
  4. 注意:宏仅仅做替换,不会影响运算优先级
    #define SQUARE(x) x*xint main()
    {int a = 2;printf("%d\n", a + 1 * a + 1);//替换为 2+1*2+1 = 5return 0;
    }

四、宏与函数

由上文可见,有的时候宏定义可以充当函数的功能,那么它们二者究竟有哪些区别呢?

函数宏定义
调试方便逐语句调试不方便调试
递归可以递归不可以递归
代码长度
执行速度相对较慢相对较快
参数类型必须是确认的类型不限类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开放大学2024年春《数控技术 060253》综合大作业参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1数控系统的核心是&#xff08; &#xff09; …

【项目管理——时间管理】【自用笔记】

1 项目时间管理&#xff08;进度管理&#xff09;概述 过程&#xff1a;&#xff08;2—6&#xff09;为规划过程组&#xff0c;7为监控过程组 题目定义&#xff1a;项目时间管理又称为进度管理&#xff0c;是指确保项目按时完成所需的过程。目标&#xff1a;时间管理的主要目标…

Rust GUI学习 小部件系列(一):如何在iced窗口中使用颜色选择器colorpicker

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 前言&#xff1a; 本系列是iced的小部件应用介绍系列&#xff0c;主要介绍iced、iced_aw两个库中涉及的各种小部件的使用及实例演示。 本文所介绍的是co…

安捷伦Agilent E5071B网络分析仪

181/2461/8938产品概述&#xff1a; Agilent E5071B 网络分析仪可为射频组件提供快速、准确的测量。与同类网络分析仪相比&#xff0c;其宽动态范围和低迹线噪声可实现更高的测试质量和吞吐量。内置 2、3 和 4 个测试端口可同时测量具有最多四个端口的组件的所有信号路径。Agi…

中国土壤厚度空间分布数据

土壤层次分为覆盖层 林溶层 淀积层 母质层&#xff0c;其中在林溶层中的最上面那层就是我们通常说的土壤厚度在这一层中&#xff0c;这一层也被称为腐殖层&#xff0c;是肥力性质最好的一层&#xff0c;植物根系和微生物也集中在这一层。至于覆盖层在森林土壤中比较常见&#x…

2024年【G3锅炉水处理】考试题及G3锅炉水处理考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G3锅炉水处理考试题参考答案及G3锅炉水处理考试试题解析是安全生产模拟考试一点通题库老师及G3锅炉水处理操作证已考过的学员汇总&#xff0c;相对有效帮助G3锅炉水处理考试报名学员顺利通过考试。 1、【多选题】锅筒…

vivado 在远程主机上启动作业、ISE命令图、实施类别,战略描述和指令映射

在远程主机上启动作业 一旦配置了远程主机&#xff0c;使用它们启动Vivado作业就很容易了。下图显示了启动运行对话框。启动跑步时&#xff0c;选择“在远程上启动跑步”hosts或Launch在群集上运行&#xff0c;然后选择特定的群集。这些作业将使用您的要执行的预配置设置。 作业…

Leetcode70. 爬楼梯(动态规划)

Leetcode原题 Leetcode70. 爬楼梯 标签 记忆化搜索 | 数学 | 动态规划 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;示例 1&#xff1a;输入&#xff1a;n 2 输出&#xff1a;2 解…

阿里云服务器安装MySQL(宝塔面板)

只写关键步骤 1. 创建一个云服务器实例 2 修改密码&#xff0c;登录服务器 3. 安装宝塔面板 进入https://www.bt.cn/new/index.html 进入宝塔面板地址 4. 安装Mysql 5. 创建数据库&#xff08;可导入数据库&#xff09; 6. 测试连接数据库 打开Navicat&#xff08;或其他数据…

centos安装jdk的坑

文章目录 一、安装jdk二、查找jdk的目录三、配置JAVA_HOME 一、安装jdk 我们一般用yum search java | grep jdk查询可以安装的jdk 但是一定要注意如下图&#xff0c;必须知道jdk和jre的区别 yum install java-1.8.0-openjdk-devel.x86_64二、查找jdk的目录 用如下命令 sudo…

chrome 浏览器报错 This page will not function without javascript enabled

This page will not function without javascript enabled. Please enable javascript on your browser. 在访问公司spark history 页面时&#xff0c;发现页面加载不全&#xff0c;并提示如上报错&#xff0c;因此按照如下步骤&#xff0c;已解决问题。 在浏览器中启用 JavaS…

OpenLayers6实战,OpenLayers绘制五角星,OpenLayers绘制特殊图形,地图上画五角星

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解如何使用OpenLayers6在地图上绘制五角星这种特殊图形的功能。 本章上一章基础上修改而成:OpenLayers6实战,OpenLayers绘制特殊图形,OpenLayers绘制四角形(菱形),OpenLayers绘制菱形 二、依赖和使用 "ol&q…

【APP_TYC】数据采集案例天眼APP查_抓包分析_②

追寻啊 你身影千年 恳请宿命怜 无尽日夜 只为见你一面 我愿化作 窗外的桑花 朝朝暮暮 都有我牵挂 无论冬雪秋沙 海角天涯 缱绻不尽 念你啊 倘若化作 林间的桑花 借一暖风 赠你梦如画 纵使悲忧如雪 一笑融化 &#x1f3b5; Joysaaaa《朝朝如念》 抓包分析 …

.NET开源免费、功能强大的 Windows 截图录屏神器

前言 今天大姚给大家分享一款.NET开源免费&#xff08;基于GPL3.0开源协议&#xff09;、功能强大、简洁灵活的 Windows 截图、录屏、Gif动图制作神器&#xff1a;ShareX。 功能特性 ShareX 是一个开源的屏幕捕捉工具&#xff0c;具有丰富的功能特性&#xff0c;包括但不限于…

洗地机好用吗?哪款型号值得推荐?看完本文你就知道

在如今社会生活节奏不断加快的情况下&#xff0c;洗地机已经成为众多家庭的必备的清洁设备&#xff0c;面对市面上种类繁多的洗地机&#xff0c;我们常常会发出感叹“洗地机好用吗&#xff1f;洗地机哪个型好用&#xff1f;”等的疑问&#xff0c;今天&#xff0c;为了帮助大家…

vue2 export default写法,computed、methods的使用

<template><div><h2>{{nameAll}}</h2><h2>{{method}}</h2><h2>{{tt()}}</h2><h2>{{firstName}}</h2><h2>更新后赋值数据&#xff1a;{{lastName}}</h2><h2>赋值数据:{{writeValue}}</h2>…

el-select动态禁用

在一个el-form表单中有5个el-form-item; 每个el-form-item是一个el-select控件&#xff1b; 这5个el-select控件遵循这样的规则&#xff0c;都是使用同一个list集合&#xff0c;如果第一个el-select选择了list中的某一项&#xff0c;那么这一项就被禁用&#xff1b;其他的el-…

YOLOv9改进策略:注意力机制 | 二阶通道注意力机制(Second-order Channel Attention,SOCA),实现单图超分效果

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;CVPR_2019 SOCA注意力&#xff0c;一种基于二阶通道注意力机制&#xff0c;能够单幅图像超分辨率&#xff0c;从原理角度分析能够在小目标检测领域实现大幅涨点效果&#xff01;&#xff01;&#xff01; &am…

2024年3月腾讯云最新活动及优惠券整理汇总

随着云计算的普及&#xff0c;腾讯云作为国内领先的云计算服务提供商&#xff0c;为用户提供了丰富的产品和服务。为了帮助用户更好地了解和使用腾讯云&#xff0c;本文将为大家整理汇总2024年3月腾讯云的最新活动及优惠券信息。 1、腾讯云最新活动入口【点此直达】 2、腾讯云…