【C语言】程序环境和预处理|预处理详解|定义宏(下)
主页:114514的代码大冒
qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ )
Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com
文章目录
目录
文章目录
前言
2.5带副作用的宏参数
2.6宏和函数的对比
3#undef
编辑
4 命令行定义
5 条件编译
6 文件包含
总结
前言
咱们书接上回
2.5带副作用的宏参数
先来看一段代码
#define MAX(x,y) ((x)>(y)?(x):(y))int main()
{int a = 4;int b = 6;int m = MAX(a++, b++);printf("%d\n", m); printf("a=%d b=%d\n", a, b);return 0;
}
这个结果是什么呢?

为什么?
我们一样要考上文中的“宏是一种替换”的概念,先做一下替换然后我们来解析一下

x+1;//不带副作用
x++;//带有副作用
但是在这里这种情况,函数就不会发生类似问题
这里我提供了测试代码,读者可自取
#define MAX(x,y) ((x)>(y)?(x):(y))int Max(int x, int y)
{return x > y ? x : y;}int main()
{//int m = MAX(2, 3);//printf("%d\n", m);int a = 4;int b = 6;int m = MAX(a++, b++);//int m = Max(a++, b++);printf("%d\n", m); // m = 7printf("a=%d b=%d\n", a, b);return 0;
}
2.6宏和函数的对比
函数的反汇编

宏的反汇编

宏明显要快不少嘛
1. 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。2. 更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型等可以用于>来比较的类型。宏是类型无关的。
宏的缺点
当然和函数相比宏也有劣势的地方:1. 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。2. 宏是没法调试的。3. 宏由于类型无关,也就不够严谨。4. 宏可能会带来运算符优先级的问题,导致程容易出现错。

宏没有类型,如上图所示,函数只能进行固定类型数据的操作,而宏却可以忽视这一细节
但是对应的,宏是一种替换,也就是说,他会把定义的内容替换到正文代码中,造成代码超度变长
另外就是像上文所说的那种“副作用”,足以看出宏在调试时的问题是比较大的,
因为“你看到的并非你看到的(宏替换的关系)”
所以总的说来,宏有着优点也有着缺点
具体使用函数还是宏,要根据实际情况

| 属 性 | #define定义宏 | 函数 |
| 代 码 长 度 | 每次使用时,宏代码都会被插入到程序中。除了非常 小的宏之外,程序的长度会大幅度增长 | 函数代码只出现于一个地方;每 次使用这个函数时,都调用那个 地方的同一份代码 |
| 执 行 速 度 | 更快 | 存在函数的调用和返回的额外开 销,所以相对慢一些 |
| 操 作 符 优 先 级 | 宏参数的求值是在所有周围表达式的上下文环境里, 除非加上括号,否则邻近操作符的优先级可能会产生 不可预料的后果,所以建议宏在书写的时候多些括 号。 | 函数参数只在函数调用的时候求 值一次,它的结果值传递给函 数。表达式的求值结果更容易预测 |
| 带 有 副 作 用 的 参 数 | 参数可能被替换到宏体中的多个位置,所以带有副作 用的参数求值可能会产生不可预料 的结果 | 函数参数只在传参的时候求值一次,结果更容易控制。 |
| 参 数 类 型 | 宏的参数与类型无关,只要对参数的操作是合法的, 它就可以使用于任何参数类型。 | 函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数,即使他们执行的任务是相同的。 |
| 调 试 | 宏是不方便调试的 | 函数是可以逐语句调试的 |
| 递 归 | 宏是不能递归的 | 函数是可以递归的 |
把宏名全部大写函数名不要全部大写
3#undef
#undef NAME//如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除。
4 命令行定义
#include <stdio.h>
int main()
{int array [ARRAY_SIZE];int i = 0;for(i = 0; i< ARRAY_SIZE; i ++){array[i] = i;}for(i = 0; i< ARRAY_SIZE; i ++){printf("%d " ,array[i]);}printf("\n" );return 0;
} //linux 环境演示
gcc -D ARRAY_SIZE=10 programe.c 5 条件编译
比如说:

------------------------------条件编译的“条件”不可以是变量------------------------------------------------
因为条件编译中的条件在预处理阶段就已经处理了,而预处理阶段不处理变量

使用方法再举例

关系可以向C语言中的“if.....else”语句考虑
更多例子

6 文件包含

这个多次包含编译器是不会进行报错的,但是这个东西意味着程序将多次调用同一段代码
这显然是多余的,ok,看起来似乎这个多次包含同一文件的错误对于个人来讲很容易规避
但是如果是
下图这般

如何避免呢?
答:条件编译

下面这个放在第一行也具有相同作用
#pragma once//这个也是OK的
#include <filename.h> 和 #include "filename.h"有什么区别?
答:如果使用尖括号,那么程序将直接在系统头文件库寻找该文件
如果使用引号,那么程序将现在本地找一找,找不到才回去系统头文件库查找
从提升效率的角度讲,系统头文件调用时应该使用<>
而个人创建的头文件,应该使用“”
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
相关文章:
【C语言】程序环境和预处理|预处理详解|定义宏(下)
主页:114514的代码大冒 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 2.5带副作用的宏参数 2.6宏和函数的对比 3#undef 编辑 4 命令行定义…...
MySQL主从复制
操作流程准备两个服务器主服务器配置1>修改主配置文件 /etc/my.cnf[mysald] log-binmysql-bin //[必须]启用二进制日志server-id12>重启 mysql 服务3>创建mysql用户并授权mysql> GRANT REPLICATION SLAVE ON ** to slaver% identified by 123456;4>查看当前主服…...
做自媒体视频变现的三大要素!
大家都知道做自媒体可以赚钱,做得好的话收入会远超自己的工资! 但有些关键点你真的知道吗?有几点是新手很容易忽略的! 1、内容价值 我们所创作的内容是否是用户所需要的?用户是不是有强烈的需求?这一点你…...
软件测试如何获得高薪?
软件测试如何获得高薪? 目录:导读 测试基础理论/测试设计能力 业务知识 行业技术知识 数据库 掌握编程语言 搞定自动化测试 质量流程管理 下面谈谈不同level的测试工程师应具备的基本能力 第一个:我们称之为测试员/测试工程师 第二…...
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)
5.4 特权级深入浅出 5.4.1 特权级哪点事 计算机 访问 可分为访问者和被访问者。 建立特权机制为了通过特权来检查合法性。 0、1、2、3级,数字越小,权力越大。 0特权级是系统内核特权级。 用户程序是3特权级,被设计为“有需求就找操作系统”…...
艾德卡EDEKA EDI 需求分析
艾德卡Edeka 是德国最大的食品零售商,因其采用“指纹付款”的方式进行结算,成为德国超市付款方式改革的先驱。2022年8月,入选2022年《财富》世界500强排行榜,位列第256位。 艾德卡EDEKA EDI需求分析 传输协议 在传输协议层面&a…...
python如何使用最简单的方式将PDF转换成Word?
由于PDF的文件大多都是只读文件,有时候为了满足可以编辑的需要通常可以将PDF文件直接转换成Word文件进行操作。 看了网络上面的python转换PDF文件为Word的相关文章感觉都比较复杂,并且关于一些图表的使用还要进行特殊的处理。 本篇文章主要讲解关于如何…...
HashMap如何避免内存泄露问题
HashMap对于Java开发人员来说,应该是一种非常非常熟悉的数据结构了,应用场景相当广泛。 本文重点不在于介绍如何使用HashMap,而是关注在使用HashMap过程中,可能会导致内存泄露的情况,下面将以示例的形式展开具体介绍。…...
crontab -e定时任务
大家好,我是空空star,本篇带你了解下crontab -e定时任务。 文章目录前言一、crontab介绍二、crontab文件的含义四、crontab用法1.每隔5分钟执行一次命令2.每个小时的第5分执行一次命令3.每天9:05执行一次命令4.每隔9小时在第5分执行一次命令5.每月5号9号…...
JavaSE学习day7_01 面向对象
1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。即各个对象的总称,比如学生是一个类,但是学生有很多个,每一个称之为对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的…...
有趣的HTML实例(十二) 早安、晚安动画(css+js)
这话在我心里已经复习了几千遍。我深恨发明不来一个新鲜飘忽的说法,只有我可以说只有你可以听,我说过,我听过,这说法就飞了,过去、现在和未来没有第二个男人好对第二个女人这样说。 ——《围城》 目录 一、前言 二、…...
入行测试已经4年了 ,进华为后迷茫了3个月,做完这个项目我决定离职....
转行测试 我是大专非计科,我转行之前从事的工作是商场管理,努力了4年左右的时间才做到楼层经理,但是工资太低并且事情太多,薪资才6K。 更多的是坚定了自己的想法,我要改变自己 恰好有几个大学同学在互联网公司工作&a…...
【halcon】灰度直方图直观理解与应用
灰度直方图 横坐标:是 0~255 表示灰度值的范围 纵坐标:是在不同灰度值下像素的个数! 那么灰度直方图的本质就是统计不同灰度下像素的个数! 它的直观目的,就是查看灰度的分布情况! 与之相关的函数ÿ…...
Android笔记:动画
文章目录1.View Animation(视图动画)1.1 Tween Animation(补间动画)Animation 继承属性透明度alpha缩放scale移动translate旋转rotateset标签Animation父类共有函数1.2Frame Animation (逐帧动画)2.Propert…...
Git学习总结
目录 Git工作的基本流程图 git基本配置 配置SSH公钥 查看提交日志(log) 版本回退 为常用指令配置别名 添加文件至忽略列表 Git操作的基本指令 编辑 Git远程仓库的操作 把黑马的Git视频看完了黑马程序员Git全套教程,完整的git项目管…...
第四天笔记
1. 简述自定义转换器的使用过程? 第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。 第二步:在 spring配置文件中配置类型转换器。 Spring配置类型转换器的机制是 将自定义的转换器注册到类型转换服务中去…...
《MySQL学习》 全局锁和表锁
一.MySQL锁的分类 二.全局锁 全局锁对整个数据库加锁,可以执行如下命令,整个数据库都将处于只读状态。 Flush tables with read lock ;我们可以执行 unlock table进行解锁 unlock table ;读操作 非读操作(阻塞) 全局锁的典型使…...
Altium Designer输出生产文件Gerber、IPC、NC Drill、坐标文件--AD
AD软件版本:22.2.1 gerber文件输出共有两部分: 1、Gerber Files:铜皮 和 外形分别导出 2、Nc Drill Files 分3次导出 一、Gerber Files 导出2次 设定原点 ** Edit->Origin->Set** 一般板边左下角为原点,可以根据自己板子形状确定 导…...
用VSCode搭建Vue.js开发环境及Vue.js第一个应用
目录 一、VSCode安装 二、VSCode简单配置 三、Vue.js的下载和引入 四、Vue.js第一个应用 一、VSCode安装 Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,可用于Windows,macOS和Linux。它内置了对JavaScrip…...
Leetcode 每日一题 2341. 数组能形成多少数对
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...
springboot基于Vue的大学生心理健康交流系统的设计与实现
目录系统架构设计数据库设计核心功能模块前端界面开发测试部署方案项目进度规划注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用前后端分离架构,后端使用SpringBoot框架提供RESTful API接…...
任意偏振与圆偏振BIC光子晶体远场偏振计算:COMSOL中的直接画偏振态
任意偏振BIC,圆偏振BIC光子晶体远场偏振计算COMSOL直接画偏振态 最近在研究任意偏振BIC(Bound states in the continuum)和圆偏振BIC光子晶体的远场偏振计算,发现用COMSOL直接画偏振态还挺有意思的。今天就来聊聊这个,…...
Grok-1大模型实战指南:如何用5大核心模块构建企业级AI应用
Grok-1大模型实战指南:如何用5大核心模块构建企业级AI应用 【免费下载链接】grok-1 马斯克旗下xAI组织开源的Grok AI项目的代码仓库镜像,此次开源的Grok-1是一个3140亿参数的混合专家模型 项目地址: https://gitcode.com/GitHub_Trending/gr/grok-1 …...
Ubuntu20.04安全重启后WiFi图标消失?MT7922网卡驱动修复全攻略
Ubuntu 20.04安全重启后MT7922网卡驱动失效的深度修复指南 问题现象与初步诊断 当你使用REISUB组合键对Ubuntu 20.04进行安全重启后,可能会发现桌面右上角的WiFi图标神秘消失。这不是简单的界面显示问题,而是MT7922无线网卡驱动未能正常加载导致的深层…...
3步构建工业级语音数据集:从混乱录音到AI训练素材的蜕变之路
3步构建工业级语音数据集:从混乱录音到AI训练素材的蜕变之路 你是否还在为语音识别模型效果不佳而烦恼?是否采集了大量语音却不知如何转化为训练数据?本文将带你通过FunASR框架提供的标准化工具链,3步完成工业级语音数据集的构建…...
互联网大厂Java求职者面试全解析:技术点与场景详解
面试场景介绍 本文通过一场严肃的面试官与搞笑的水货程序员谢飞机之间的面试对话,带你深入了解互联网大厂Java面试的全套流程。涵盖Java核心语言与平台、Spring生态、微服务、安全、消息队列等热点技术,融合多种业务场景,如电商、内容社区、在…...
保姆级教程:Arduino IDE离线安装ESP32开发板支持包(附稳定镜像源)
Arduino IDE离线安装ESP32开发板支持包全攻略 对于国内开发者来说,Arduino IDE安装ESP32开发板支持包常常会遇到网络连接不稳定、下载速度慢甚至完全无法访问的问题。本文将提供一套完整的离线安装方案,通过国内镜像源和分步操作指南,确保即…...
【AI平台】n8n进阶指南:Docker环境下无缝更新与配置保留实战
1. 为什么需要无缝更新n8n? 如果你正在使用n8n这个强大的工作流自动化工具,肯定会遇到版本更新的问题。作为一个长期使用n8n的开发者,我深刻理解那种"既想用新功能又怕配置丢失"的矛盾心理。每次看到n8n后台的更新提示,…...
FineBI连接MySQL实战:手把手教你从零搭建第一个学生数据分析看板
FineBI连接MySQL实战:从零构建学生数据分析看板 当教务系统的学生信息沉睡在MySQL数据库中时,FineBI能像魔法师一样将它们唤醒为生动的可视化图表。我曾为某高校搭建第一个招生分析看板时,仅用三小时就让校领导看到了历年录取数据的立体画像—…...
ChatTTS一键启动:从零搭建语音合成服务的实战指南
语音合成服务在现代应用中扮演着越来越重要的角色。它被广泛应用于智能客服、有声读物生成和视频内容配音等场景。通过将文本转化为自然流畅的语音,极大地提升了人机交互的体验和应用的可访问性。 然而,对于希望快速部署ChatTTS这类先进语音合成模型的开…...

