《21天学通C++》(第十四章) 宏和模板介绍(1)

1.使用#define定义常量

例子

#include <iostream>
#include <string>
using namespace std;#define ARRAY_LENGTH 25
#define PI 3.1415
#define MY_DOUBLE double
#define FAV_WHISKY "Jack"int main() {int number [ARRAY_LENGTH]={0};cout<<"Array's length: "<<sizeof(number)/sizeof(int)<<endl;cout<<"radius"<<endl;MY_DOUBLE radius=0;cin>>radius;cout<<"Area is: "<<PI*radius*radius<<endl;string sky (FAV_WHISKY);cout<<"sky "<<FAV_WHISKY<<endl;system("pause");return 0;
}

PS: 预处理无法知道数据类型,即PI是3.1415,但不知道是什么类的数据

2.使用宏避免多次包含

多次包含: 是指同一个头文件在编译过程中被包含超过一次,例如,头文件A包含了头文件B,而头文件C也包含了头文件B。如果源文件D同时包含了头文件A和C,那么头文件B实际上被包含了两次。

使用#ifndef#endif来避免

// MyHeader.h#ifndef MY_HEADER_H//查找有没有MY_HEADER_H
#define MY_HEADER_H//没有就定义一个MY_HEADER_H
// 头文件的内容开始
class MyClass {
public:void myFunction();
};
// 头文件的内容结束
#endif // MY_HEADER_H

3.使用#define定义宏函数

例子

#include <iostream>
#include <string>
using namespace std;#define SQUARE(x) ((x)*(x))//计算平方值
#define PI 3.1415
#define AREA(r) ((PI)*(r)*(r)) //计算圆面积int main() {cout<<"enter x:"<<endl;int num1=0;cin>>num1;cout<<"x*x= "<<SQUARE(num1)<<endl;cout<<"enter radius:"<<endl;int num2=0;cin>>num2;cout<<"Area is "<<AREA(num2)<<endl;system("pause");return 0;
}

PS: 在定义时一定要使用括号,可以让宏代码不受运算符优先级影响

4.使用assert宏验证表达式

assert宏是断言的一种实现,用于在程序运行时检查某个条件是否为真。如果条件为假,assert宏会终止程序的执行,并通过标准错误输出流输出一条错误消息。

使用assert需要包含<cassert>

#include <iostream>
#include <cassert>
using namespace std;
int main() {int x = 10;int y = 20;// 验证x是否小于yassert(x < y);// 如果x不小于y,assert宏将触发断言失败,程序将终止执行// 如果x小于y,程序将继续执行cout << "ok" << endl;system("pause");return 0;
}

5.使用宏函数的优点和缺点

优点
①代码复用: 宏允许你定义可复用的代码片段,这些片段可以在多个地方使用,而不需要重复编写。

②简洁性: 宏可以简化复杂的表达式或操作,使代码更加简洁。

③条件编译: 宏可以用于条件编译,允许根据不同的编译条件包含或排除代码段。

④类型无关性: 宏不关心数据类型,因此可以用于多种类型的操作,提供更大的灵活性。

⑤性能: 宏可以用于内联函数,避免函数调用的开销,从而可能提高程序的性能。

⑥跨平台兼容性: 宏可以用来定义跨不同平台或编译器的兼容代码。

缺点
①调试难度: 宏在调试时可能导致困难,因为它们在预处理阶段就进行了替换,这可能会使得调试信息变得混乱。

②类型安全: 宏不进行类型检查,可能会导致类型不安全的错误,特别是在复杂的宏定义中。

③可读性: 过度使用宏可能会降低代码的可读性,特别是当宏在多个文件中被包含时。

④维护性: 宏可能使得代码的维护变得更加困难,因为它们的行为可能不直观,且难以追踪。

⑤优化难度: 由于宏在预处理阶段就进行了替换,编译器的优化器可能无法有效地对使用宏的代码进行优化。

PS: 尽量不要自己编写宏函数

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

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

相关文章

AI神助攻!小白也能制作自动重命名工具~

我们平时从网上下载一些文件&#xff0c;文件名很多都是一大串字母和数字&#xff0c;不打开看看&#xff0c;根本不知道里面是什么内容。 我想能不能做个工具&#xff0c;把我们一个文件夹下面的所有word、excel、ppt、pdf文件重命名为文件内容的第一行。 我们有些朋友可能不会…

全国33个省228189个矿产地位置分布数据,含经纬度坐标/CSV格式

全国矿产地分布&#xff08;2021版&#xff09; 数据来源&#xff1a; 全国矿产地数据库2021版 (ngac.org.cn) http://data.ngac.org.cn/mineralresource/index.html 数据获取方法&#xff1a;树谷资料库大全&#xff08;2024年4月19日更新&#xff09; 进入网站后&#xf…

【华为】路由策略小实验

【华为】软考中级-路由策略实验 实验需求拓扑配置AR1AR2需求1需求2 AR3 检验 实验需求 1、让 R3 可以学到R1的 192.168.10.0/24和192.168.20.0/24的 路由&#xff0c;不能学到192.168.30.0/24。 2、让 R1可以学到 R3 的 172.16.20.0/24和172.16.30.0/24的路由&#xff0c;不能…

OSTEP Projects:Reverse

本文将介绍操作系统导论&#xff08;Operating Systems: Three Easy Pieces&#xff09;作者所开源的操作系统相关课程项目 的 Reverse 部分&#xff0c;包含个人的代码实现和设计思路。 思路 题目的要求很简单&#xff1a;按行读取数据&#xff0c;读取完成后将所读取到的所有…

75.网络游戏逆向分析与漏洞攻防-角色与怪物信息的更新-伪造服务端更新属性消息欺骗客户端

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

wordpress外贸网站建设主机选择的注意事项

在为WordPress外贸网站建设选择主机时&#xff0c;您需要注意以下几点&#xff1a; 服务器地理位置&#xff1a; 选择一个靠近目标客户群的服务器位置&#xff0c;这将有助于提高网站的加载速度和可靠性。通常&#xff0c;如果您的目标客户群是国外用户&#xff0c;建议选择美…

UE5(射线检测)学习笔记

这一篇会讲解射线检测点击事件、离开悬停、进入悬停事件的检测&#xff0c;以及关闭射线检测的事件&#xff0c;和射线检测蓝图的基础讲解。 创建一个简单的第三人称模板 创建一个射线检测的文件夹RadiationInspection&#xff0c;并且右键蓝图-场景组件-命名为BPC_Radiation…

语音识别简介

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

MySQL没有初始化配置文件设置属性

情况描述 安装mysql的时候&#xff0c;为了速度&#xff0c;并没有配置my.ini或者my.cnf文件&#xff0c;数据库因为断电&#xff0c;导致数据都看不见了&#xff0c;一直提示不存在&#xff0c;这时候需要修改配置文件&#xff0c;将innodb_force_recovery设置为0到6的值&…

淘宝商品评论数据获取:从API调用到应用实践

在电商的世界里&#xff0c;用户评论是洞察商品质量的一扇窗。淘宝&#xff0c;作为中国最大的在线购物平台&#xff0c;其海量的商品评论数据尤为宝贵。本文将带您走进淘宝商品评论数据的获取之旅&#xff0c;从API调用的基础知识到实际应用的代码示例&#xff0c;一探究竟。 …

Pycharm debug 运行报错 (RuntimeError: cannot release un-acquired lock)

问题描述&#xff1a; 最近再跑一个 flask应用&#xff0c;Pycharm 运行没问题&#xff0c;debug断点启动时报错 如下&#xff1a; 解决方案&#xff1a; 在环境变量中增加 GEVENT_SUPPORTTrue 启动成功&#xff01;

[激光原理与应用-92]:振镜的光路图原理

目录 一、振镜的光路 二、振镜的工作原理 2.1 概述 2.2 焊接头 2.3 准直聚焦头-直吹头 2.4 准直聚焦头分类——按应用分 2.4.1 准直聚焦头分类——功能分类 2.4.2 准直聚焦头镜片 2.4.3 振镜焊接头 2.4.4 振镜分类&#xff1a; 2.4.5 动态聚焦系统演示&#xff08;素…

MQ如何保证可靠性

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;MQ ⛺️稳中求进&#xff0c;晒太阳 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 2.数据持久化 为了提高性能&a…

被苹果商店打回20多个包,App Store都干了啥!

本次被拒的App涉及金融、教育、游戏等各个领域&#xff0c;其中既有首发产品也有更新产品&#xff0c;原因多涉及疑似切支付、马甲包等问题&#xff1b;不过也有部分开发者反映遭到”误伤”&#xff0c;正常包体也被打回。 从今年1月底开始&#xff0c;许多开发者发现在向苹果…

Typescript语法二

继承 继承是⾯向对象编程中的重要机制&#xff0c;允许⼀个类&#xff08;⼦类或派⽣类&#xff09;继承另⼀个类&#xff08;⽗类或基类&#xff09;的属性和⽅法。⼦类可以直接使⽤⽗类的特性&#xff0c;并根据需要添加新的特性或覆盖现有的特性。这种机制赋予⾯向对象程序良…

头歌 实验六 Java流式编程与网络程序设计

实验六 Java流式编程与网络程序设计 制作不易&#xff01;点个关注&#xff0c;给大家带来更多的价值 第1关 字节输入/输出流实现数据的保存和读取 package step1;import java.io.*; import java.util.*;public class SortArray {public static void main(String[] args) {/…

getchar和putchar函数详解

getchar和putchar函数详解 1.getchar函数1.1函数概述1.2函数返回值1.3函数注意事项1.4函数的使用 2.putchar函数2.1函数概述2.2函数返回值2.3函数使用实例 1.getchar函数 1.1函数概述 从一个流中读取一个字符&#xff0c;或者从标准输入中获得一个字符 函数原型&#xff1a; …

Sa-Token框架入门使用

说明&#xff1a;Sa-Token是一个轻量级java权限认证框架&#xff08;官方语&#xff09;&#xff0c;所谓权限认证框架&#xff0c;就是登录框架&#xff0c;像Shiro、Spring Security。本文介绍Sa-Token框架的入门使用&#xff0c;基于Spring Boot环境。 准备工作 首先&…

滑动窗口 | 1652. 拆炸弹 |LeetCode

文章目录 题目介绍暴力(可以过力扣竟然。不愧是简单题)&#xff1a;滑动窗口 祝你天天开心 题目介绍 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每…

第12章 消息服务 ❤❤❤❤

第12章 消息服务 12.1 JMS_ActiveMQ1. 简介2. ActiveMQ安装Linux安装命令问题1:网页访问不了问题2: 修改密码3. 整合SpringBoot3.1 依赖3.2 配置3.3 JmsComponent 组件3.4 测试12.2 AMQP_RabbitMQ1. 简介2. RabbitMQ