《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是否小于y
    assert(x < y);

    // 如果x不小于y,assert宏将触发断言失败,程序将终止执行
    // 如果x小于y,程序将继续执行

    cout << "ok" << endl;
    system("pause");
    return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s概述及核心组件

一、k8s概述 1.1 引言 docker compose 单机编排工具 有企业在用 docker swarm 能够在多台主机中构建一个docker集群 基本淘汰集群化管理处理工具 容器 微服务封装 dockerfile 编写成镜像 然后进行发布 dockerfile 可以写成shell脚本&#xff08;函数做调…

【Linux网络编程】HTTPS协议

【Linux网络编程】HTTPS协议 目录 【Linux网络编程】HTTPS协议HTTPS介绍加密常见的加密方式HTTPS的工作过程探究&#xff08;重点&#xff09;常见问题完整流程总结 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.5.9 前言&#xff1a;本篇博客将会介绍HTTPS协议 HTTPS…

【记录】常见的前端设计系统(Design System)

解释一下设计系统的定义&#xff0c;以及在国内&#xff0c;都有那些优秀的设计系统可以学习&#xff0c;希望可以帮到大家。 什么是设计系统&#xff08;Design System)&#xff1f; 设计系统&#xff08;Design System&#xff09;是一套综合性的指导原则、组件和规则&…

VBA技术资料MF152:列出工作表中所有单元格的注释

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Linux进程——Linux环境变量

前言&#xff1a;在结束完上一篇的命令行参数时&#xff0c;我们简单的了解了一下Linux中的环境变量PATH&#xff0c;而环境变量不只有PATH&#xff0c;关于更多环境变量的知识我们将在本篇展开&#xff01; 本篇主要内容&#xff1a; 常见的环境变量 获取环境变量的三种方式 本…

GORM数据库连接池对接Prometheus

一、背景与介绍 Golang的database/sql包定了关于操作数据库的相关接口&#xff0c;但是没有去做对应数据库的实现。这些实现是预留给开发者或者对应厂商进行实现的。 其中让我比较关注的是Golang的sql包有没有实现连接池pool的机制呢? 毕竟Golang是静态语言&#xff0c;类似J…

pwn(一)前置技能

以下是pwn中的题目&#xff08;漏洞&#xff09;类型&#xff1a; 关于pwn的学习&#xff1a; 一.什么是pwn&#xff1f;&#xff08;二进制的漏洞&#xff09; "Pwn"是一个俚语&#xff0c;起源于电子游戏社区&#xff0c;经常在英语中用作网络或电子游戏文化中的…

AI中转站计费平台系统源码一站式解决方案安装说明

AI中转站计费平台系统源码一站式解决方案安装说明 功能 | Features AI 联网功能 AI online searching service 多账户均衡负载 Multi-account load balancing HTTP2 Stream 实时响应功能 HTTP2 Stream real-time response function 节流和鉴权体系 Throttling and authenticati…

GitHub中Asterank源码python修改成C++(本人python不太会)

GitHub - typpo/asterank: asteroid database, interactive visualizations, and discovery tools 主要目的是在进行多元线性回归的时候将枚举型转换为数值型 python: # # The constants used in calculations for the values of asteroids. ## General constants GENERAL_I…

基于Detectron2的计算机视觉实践

书籍&#xff1a;Hands-On Computer Vision with Detectron2: Develop object detection and segmentation models with a code and visualization approach 作者&#xff1a;Van Vung Pham&#xff0c;Tommy Dang 出版&#xff1a;Packt Publishing 书籍下载-《基于Detectr…

.OpenNJet应用引擎实践——从 0-1 体验感受

目录 一. &#x1f981; 写在前面二. &#x1f981; 安装使用2.1 安装环境2.2 配置yum源2.3 安装软件包2.4 编译代码2.5 启动 三. &#x1f981; 使用效果3.1 编辑配置文件3.2 编辑 HTML 代码 四. &#x1f981; 使用感受 一. &#x1f981; 写在前面 现在互联网体系越来越往云…

小丑的身份证和复印件 (BFS + Floyd)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 2 10 (JOKERjoke #####asdr) 输出 12 思路&#xff1a; 根据题意&#xff0c;要求最短时间&#xff0c;实际上也可以理解为最短距离。 所以应该联想到有关最短距离的算法&…

css z-Index 详解--子元素盖在父元素的兄弟元素上

前置知识 1、z-index 只有在定位元素上才会生效&#xff08;即非static定位的元素上&#xff09; 2、同级元素&#xff0c;无论是z-index 相同还是没设置。后面的元素层级比前面 3、元素上有 transform 属性 z-index 会失效 dom结构如下 // dom部分 <div><div id&quo…

latex algorithm2e 库学习总结

案例1 \documentclass{article}\usepackage{xeCJK} \usepackage[]{algorithm2e} %\usepackage{ctex} % 中文包\begin{document}\renewcommand{\algorithmcfname}{算法} % 把标题设置为“算法” \begin{algorithm…

html table thead打印时带重复表头不生效

今天做一个打印功能时要求每页都带相同的表头&#xff0c;使用的方式是table的thead标签来实现&#xff0c;结果发现thead里边的内容放多了之后只有第一页才会有表头。最后发现问题是 thead的内容不能超过table的25%。

实例分割——Mask R-CNN、YOLOV8、RTMDET、DeepLab四种实例分割算法比对

1.概述 1.1 语义分割与实例分割 实例分割和语义分割都是计算机视觉领域中图像分割的任务&#xff0c;它们在目标和方法上有一些区别&#xff1a; 语义分割&#xff1a; 语义分割的目标是对图像中的每个像素打上类别标签&#xff0c;即识别出图像中每个像素属于哪个预定义的…

云动态摘要 2024-05-09

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

YOLOv5,YOLOv7改进之结合​SOCA

1.SOCA moudle结构图 2,YOLOv5,YOLOv7改进之结合​SOCA 1.配置common.py文件 #SOCA moudle 单幅图像超分辨率 class Covpool(Function):@staticmethoddef forward(ctx, input):x = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]h = x.data.shape[2]w = x.data.sha…

PLC学习笔记

PLC学习笔记 前言一、一些基操知识二、GX works2编程2.1 位逻辑1.2 中间寄存器1.3 PLC的扫描方式 总结 前言 我这个人真的是太渴望知识了~ 一、一些基操知识 一般X表示输入&#xff0c;Y表示输出。一般八个为一组X0~X7M表示中间寄存器&#xff0c;M0~M7时间T、计数C 二、GX …

短信群发公司

伴随着移动互联网和智能手机的普及&#xff0c;短信群发成为了企业与个人之间高效沟通的一种重要方式。短信群发公司应运而生&#xff0c;致力于为用户提供专业、安全、高效的群发服务。 服务内容 短信群发公司提供多样化的服务内容&#xff0c;满足不同用户的需求。短信群发公…
最新文章