C++ 宏

C++中的宏是一种预处理指令,用于在编译时将代码中的标识符替换为指定的文本。

#define 指令

1.无参宏定义

无参宏的宏名后不带参数。
其定义的一般形式为:

#define  标识符  字符串

其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。
例如:

#define MAXNUM 99999

这样MAXNUM就被简单的定义为99999。

2.有参宏定义

C++语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为:

 #define  宏名(形参表)  字符串

在字符串中含有各个形参。在使用时调用带参宏调用的一般形式为:宏名(实参表);

#define add(x, y) (x + y)int main(){//输出“1 plus 1 is 2.5.”cout << "1 plus 1 is " << add(1, 1.5) << ".\n";system("pause");return(0);
}

这个“函数”定义了加法,但是该“函数”没有类型检查,有点类似模板,但没有模板安全,可以看做一个简单的模板。

注意:该“函数”定义为(a + b),在这里加括号的原因是,宏定义只是在预处理阶段做了简单的替换,如果单纯的替换为a + b时,当你使用5 * add(2, 3)时,被替换为5 * 2 + 3,值为13,而非5 * (2 + 3),值为25。

#ifndef 指令

使用 ifndef 防止头文件被重复包含和编译。这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言或C++在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言和C++的编译系统包括预处理,编译和链接等部分。

#ifndef x //先测试x是否被宏定义过
#define x //如果没有宏定义下面就宏定义x并编译下面的语句
...
...
...
#endif //如果已经定义了则编译#endif后面的语句

条件指示符 #ifndef 检查预编译常量在前面是否已经被宏定义。如果在前面没有被宏定义,则条件指示符的值为,于是从 #ifndef 到 #endif 之间的所有语句都被包含进来进行编译处理。相反,如果 #ifndef 指示符的值为假,则它与 #endif 指示符之间的行将被忽略。条件指示符 #ifndef 的最主要目的是防止头文件的重复包含和编译

千万不要忽略了头文件的中的 #ifndef ,这是一个很关键的东西。比如你有两个C(或C++)文件,这两个C(或C++)文件都 include 了同一个头文件。而编译时,这两个C(或C++)文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

所以还是把头文件的内容都放在 #ifndef 和 #endif 中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

#ifndef <标识>
#define <标识>
...
#endif

<标识> 在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如(这里以C语言举例子,因为这一讲的内容同时适用于C和C++):stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif#ifndef xxx //如果没有定义xxx
#define xxx //定义xxx
#endif //结束如果

 这个用法主要是在头文件中,主要是为了防止类重复的 include ,所以在类的头文件之前加上前面两个,用类名替代 xxx ,在最后加上最后一句。

#undef指令

#undef是用来撤销宏定义的,用法如下:

#define PI 3.141592654
...
// code
#undef PI
//下面开始 PI 就失效了

宏定义相关作用符

换行符 \

我们定义宏语句或者宏函数时有很多条语句时怎么办?在每行末尾(除了最后一行)加上 \ ,代表换行的意思。

#include <cstdio>
#define Print   printf("这是第1条语句\n");\printf("这是第2条语句\n");\printf("这是第3条语句\n")#define Show(str1,str2,str3)\
{\printf("%s\n",str1);\printf("%s\n",str2);\printf("%s\n",str3);\	
}
using namespace std;int main()
{Print;  //无参数宏函数Show("first","second","third"); //带参数宏函数return 0;
}

执行结果: 

 

字符串化符 #

# 是“字符串化”的意思,把在宏定义中跟在 # 后面的参数转换成一个字符串。

#include <cstdio>
#define Print(str)\
{\printf(#str"的值是%d",str);\	
}
using namespace std;int main()
{int x=3,y=4;Print(x+y); //此处等价于printf("x+y""的值是%d",x+y);//#str等价于"x+y",所以#str不需要再用双引号引起来 return 0;
}

片段连接符 ##

## 是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些 ## 来替代空格。

#include <cstdio>
#define Add(n,value)\
{\num##n+=value;\
}
using namespace std;int main()
{int num1=1;int num2=10;Add(2,10); //等价于num2+=10; 这里把num和2连接成了num2 printf(" num1=%d\n num2=%d",num1,num2); return 0;
}

 参考C++入门教程(十一、宏)_c++ 宏-CSDN博客

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

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

相关文章

React:useState和useEffect

最近因为想要开发一个简单的应用才开始接触React。但是并没有系统学习React&#xff0c;所以这篇博客可能会写的不够专业。 1. Hooks 在程序设计语言中&#xff0c;钩子(hook)是一种机制&#xff0c;它可以允许程序在某些预定的事件或位置执行特定的代码。在React中&#xff0c…

水平自动扩容和缩容HPA、Networkpolicy、kubernetes用户安全控制和kubernetes创建普通用户(2024-07-10)

一、水平自动扩容和缩容HPA HPA全称是Horizontal Pod Autoscaler&#xff0c;翻译成中文是POD水平自动伸缩&#xff0c;HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容&#xff08;除了CPU利用率也可以基于其他应程序提供的…

LLM 合成数据生成完整指南

大型语言模型是强大的工具&#xff0c;不仅可以生成类似人类的文本&#xff0c;还可以创建高质量的合成数据。这种能力正在改变我们进行 AI 开发的方式&#xff0c;特别是在现实世界数据稀缺、昂贵或隐私敏感的情况下。在本综合指南中&#xff0c;我们将探索 LLM 驱动的合成数据…

DP讨论——建造者模式

学而时习之&#xff0c;温故而知新。 敌人出招&#xff08;使用场景&#xff09; 组合关系中&#xff0c;如果要A对象创建B对象&#xff0c;或者要A对象创建一堆对象&#xff0c;这种是普遍的需求。 你出招 这种适合创建者模式&#xff0c;我感觉也是比较常见的。 构造函数…

速盾:如何加强网站的安全性

随着互联网的快速发展&#xff0c;网站的安全性变得越来越重要。CDN&#xff08;内容分发网络&#xff09;是一种常见的网络加速服务&#xff0c;它可以将网站的静态内容分发到全球各地的服务器上&#xff0c;以提供更快的访问速度。然而&#xff0c;CDN 也存在一些安全风险&am…

C语言——流程控制:if...else、switch...case

控制类语句&#xff1a; 逻辑运算符&#xff1a; 选择语句&#xff1a; if...else&#xff1a; if&#xff08;&#xff09;括号内的内容终究会被转换成0,1&#xff0c;满足的话即为1&#xff0c;不满足的话为0。因此要注意&#xff0c;&#xff08;&#xff09;括号内因为条件…

简单实现一个本地ChatGPT web服务(langchain框架)

简单实现一个本地ChatGPT 服务&#xff0c;用到langchain框架&#xff0c;fastapi,并且本地安装了ollama。 依赖安装&#xff1a; pip install langchain pip install langchain_community pip install langchain-cli # langchain v0.2 2024年5月最新版本 pip install bs4 pi…

ChatGPT摆脱“AI味”:全面提升写作质感

ChatGPT在各种写作、创作场景都发挥了很大的价值&#xff0c;即使中文语料库占比不到5%&#xff0c;也能生成流畅的中文文本。但随着使用的深入&#xff0c;大家也逐渐发现了机器生成的内容&#xff0c;往往带有一种僵硬、刻板的“AI味”&#xff0c;尤其在论文、自媒体写作中&…

Mysql中索引的分类、增删改查与存储引擎对应关系

场景 Mysql中存储引擎简介、修改、查询、选择&#xff1a; Mysql中存储引擎简介、修改、查询、选择-CSDN博客 上面介绍Mysql的存储引擎。 下面介绍索引的分类和使用。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客 实现 Mysql中索引的分类 1、普通索引和唯一…

算法力扣刷题记录 四十三【最大、最小深度问题】

前言 本文学习树的深度问题&#xff1a;二叉树&#xff08;N叉树&#xff09;最大深度、最小深度&#xff1b; 记录 三十九【层序遍历模版应用二】中解决过二叉树的最大深度和最小深度题目。思路是按层遍历&#xff1a; 最大深度&#xff0c;相当于层序遍历结束&#xff1b;…

ZBLOG程序怎么天收录?本人亲自试过请看以下教程(zblog怎么样)

您为管理员组&#xff0c;请查看下方隐藏内容&#xff01; 先去ZBLOG官网下载ZBLOG程序 直达地址https://www.zblogcn.com/ 安装到宝塔里 安装好了之后打开zblog的后台 点开应用中心搜索CMS自适应资讯主题免费 安装即可 安装了之后配置主题内容 有经验者可以去吧动态改成…

周鸿祎关于2024年AI看法

1、2024年初AI三件大事 谷歌推出Gemini新版本&#xff0c;支持超过100万个token窗口 英伟达推出ChatWithRTX &#xff0c;要把每个人的电脑都折腾成一个私有大模型 Sora,OpenAI新推出的一个文生视频的新模型。 2、2024年大模型发展十大趋势判断&#xff08;周鸿&#xf…

pnpm9.5.0(catalog协议)

catalog(目录协议) 目录是工作区功能&#xff0c;用于将依赖版本范围定义为可重用常量&#xff0c;目录中定义的常量可以在package.json中使用&#xff0c; 结合 pnpm-workspace.yaml使用 定义pnpm-workspace.yaml packages&#xff1a;定义多仓库 packages:- packages/*cata…

Spring 外部jar包Bean自动装配

Spring 外部jar包Bean自动装配 背景介绍 公共代码模块被作为jar包引入业务项目&#xff0c;前者定义的bean即使添加了Component注解由于不会被扫描到也就无法被Spring管理。此处通过Spring SPI机制来完成 使用 spring.factories 在外部 jar 包中创建 spring.factories 文件&a…

Flink异常:org/apache/hadoop/hive/ql/parse/SemanticException

在flink项目中跑 上面这段代码出现如下这个异常&#xff0c; java.lang.NoClassDefFoundError: org/apache/thrift/TException 加上下面这个依赖后不报错 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId…

【逆向基础】十、工具分享之DIE(Detect It Easy)

一、简介 DIE&#xff08;Detect It Easy&#xff09;是一款可以轻松检测PE文件的程序&#xff1b;其主要作用是查壳&#xff0c;并将pe文件的内容解析出来&#xff0c;包括PE文件中包含的导入函数、导出函数的名称及地址&#xff0c;入口函数地址等&#xff0c;是技术人员分析…

lua 脚本语言 : 基础到高级语法

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

JupyterNotebook中导出当前环境,并存储为requirements.txt

​使用Anaconda管理Python环境时&#xff0c;可以轻松地导出环境配置&#xff0c;以便在其他机器或环境中重新创建相同的环境。可以通过生成一个environment.yml文件实现的&#xff0c;该文件包含了环境中安装的所有包及其版本。但是&#xff0c;常常在一些课程中JupyterNotebo…

Python基础-循环语句

本篇针对有c语言或其他语言编程基础的&#xff0c;主要展示Python循环语句编程的一些不同语法。 先来看一个简单的while循环案例&#xff0c;求1~100累加的和 。 i1 s0 while i<100:sii1 print(s) while循环练习 生成1~100的随机数&#xff0c;循环猜测直到猜对&#xf…

微信小程序毕业设计-学习资料库系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…