C++共享和保护——(5)编译预处理命令

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
耕耘者的汗水是哺育种子成长的乳汁!

一起加油!


目录

一、前言:

二、C++常见的预处理命令: 

1.宏定义命令

💦例:简单宏定义应用:已知半径,编程求圆的周长、面积和球的体积。

🔑说明:

💦例:带参数的宏定义。

 2.文件包含命令

 3.条件编译命令

💦例:条件编译命令示例。

三、使用条件编译指令防止头文件被重复引用:

四、共勉:


一、前言:

        C++从C语言那里继承了编译预处理。编译预处理的作用是对程序文本进行扫描,对其进行初步转换,产生新的源代码并提交给编译器。所有预处理指令在程序中都是以“#”来引导的,一条预处理指令单独占用一行,结束的位置没有分号。预处理指令可以根据需要出现在程序中的任何位置。

二、C++常见的预处理命令: 

1.宏定义命令

        这种命令一般用在 C 语言中,在 C++中很少使用,宏定义命令分为简单宏定义命令和带参数宏定义命令。
        简单宏定义命令用来将一个标识符定义为一个字符串。在预处理时,将程序中出现的宏名用被定义的字符串替换,称为宏替换,替换后再进行编译。 

💦例:简单宏定义应用:已知半径,编程求圆的周长、面积和球的体积。

#include<iostream>
using namespace std;
const double PI=3.14159//定义的常量为double型 
int main(){
	double r,l,s,v;
	cout<<"Input radius:";
	cin>>r;
	l=2*PI*r;
	s=PI*r*r;
	v=4.0/3.0*PI*r*r*r;
	cout<<"周长 l="<<l<<endl<<"面积 s="<<s<<endl<<"体积 v="<<v<<endl;
	return 0; 
} 

🔑说明:

        程序中所有的 PI 都被宏定义的字符串替换掉。这种简单的替换一般在C语言中使用,用来定义符号常量。而在 C++中使用常类型 const 来定义常量,const 可以定义不同类型的常量。 

        带参数的宏定义命令是指在宏名后面跟着参数表,在替换时,仅替换宏定义中与参数表相同的标识符。带参数的宏定义中出现的参数被称为形参,在程序中用宏定义时出现的参数则被称为实参。         

💦例:带参数的宏定义。

#include<iostream>
using namespace std;
#define MUL(x,y) (x)*(y)
int main(){
	int x,y;
	cin>>x>>y;
	cout<<MUL(x,y)<<endl;
	return 0;
} 

 2.文件包含命令

        文件包含命令用来将另一个源文件嵌入到当前文件中的某个位置,以备将来需要时使用。C++

中常用的有#include <iostream>(提供有关输入/输出的功能)和#include <cmath> (提供许多数学计算的函数),文件包含命令一般放在程序的开头,有如下两种格式。
(1)#include <文件名>
        按标准方式搜索,文件位于系统目录的 include 子目录下
(2)#include "文件名"
        首先在当前目录中搜索,若没有,再按标准方式搜索#include 指令可以嵌套使用。假设有一个头文件 myhead.h,该头文件中可以有如下的文件包含命令:

#include"file1.h"
#include"file2.h"

 3.条件编译命令

        使用条件编译指令,可以限定程序中的某些内容只有在满足一定条件的情况下才参与编译
(1)格式1

#ifdef<标识符>
<程序段 1>
#else
<程序段 2>
#endif

当标识符被宏定义时,程序段 1参与编译,否则,程序段 2 参与编译

(2)格式2

#ifndef<标识符>
<程序段 1>
#else
<程序段 2>
#endif

当标识符未被宏定义时,程序段 1参与编译;否则,程序段 2参与编译 

(3)格式3
#if<常量表达式>
<程序段 1>
#else
<程序段 2>
#endif

当常量表达式的值非 0时,程序段 1 参与编译;否则,程序段2参与编译

💦例:条件编译命令示例。

#ifndef T
	#define T 1
#endif
#if T==1
	char s[]="good morning!";
#endif
#include<iostream>
using namespace std;
int main(){
	cout<<"hello!"<<s<<endl;
	return 0;
} 

三、使用条件编译指令防止头文件被重复引用:

        由于文件包含指令可以嵌套使用,所以在设计程序时要避免多次重复包含同一个头文件,否则会引起变量及类的重复定义。例如,某个工程包含如下四个源文件。

//main.cpp
#include"file1.h"
#include"file2.h"

int main(){
	…… 
}

//file1.h
#include"head.h"


……

 
//file.h
#include"head.h"


……

//head.h


……
class Point{
	…… 
};

……

        此时,由于#include 指令的嵌套使用,头文件 head.h 被包含了两次,于是编译时系统会指出错误:类 Point 被重复定义。那么,如何避免这种情况呢?这就要在可能被重复包含的头文件中使用条件编译指令。用一个唯一的标识符来标记某文件是否已参加过编译,如果已参加过编译,则说明该程序段是被重复包含的,编译时忽略重复部分。将文件 head.h 改写为:

//head.h
#ifdef_HEAD_H
#define HEAD_H 
……
class Point{
	…… 
}; 

……

#endif 

四、共勉:

        以上就是我对C++共享和保护——(5)编译预处理命令的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++共享和保护的理解,请持续关注我哦!!! 

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

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

相关文章

制造企业可以通过哪些措施改善设备OEE

设备综合效率OEE&#xff08;Overall Equipment Effectiveness&#xff09;是制造企业衡量设备效率的关键指标之一。高效的设备运行对于提高生产效率、降低成本和实现竞争优势至关重要。然而&#xff0c;实现高水平的设备OEE并不是一项简单的任务。本文将介绍一些制造企业可以采…

基于博弈树的开源五子棋AI教程[1 位棋盘]

0 引子 常见的五子棋棋盘大小为15x15&#xff0c;最直观的表示就是一个二维数据。本文为了易于拓展一开始使用的是QVector<QVector>的数据&#xff0c;但是在分支因子为10的情况下只能搜索到4层左右&#xff0c;后面深度加深&#xff0c;搜索时间呈指数倍数增长。这种实…

【LeetCode刷题】--245.最短单词距离III

245.最短单词距离III class Solution {public int shortestWordDistance(String[] wordsDict, String word1, String word2) {int len wordsDict.length;int ans len;if(word1.equals(word2)){int prev -1;for(int i 0;i<len;i){String word wordsDict[i];if(word.equa…

算法基础之约数个数

约数个数 核心思想&#xff1a; 用哈希表存每个质因数的指数 然后套公式 #include <iostream>#include <algorithm>#include <unordered_map>#include <vector>using namespace std;const int N 110 , mod 1e9 7;typedef long long LL; //long l…

互式流程图|BPMN JointJS+ JavaScript 3.7.3 Crack

JointJS 是 JavaScript 图表库为卓越的 UI 提供支持 使用经过验证的库快速、自信地构建高级视觉和无代码/低代码应用程序。 赋能全球行业领导者 使用 JointJS 构建的图表 一个库&#xff0c;‍无限 UI 选项 直接在您的应用程序中享受交互式流程图、BPMN 和其他图表工作室。利用…

MyBatis的配置文件

目录 MyBatis配置 1.properties标签 2.typeAliases标签 3.Mappers标签 一个最全面的MyBatis配置文件可能会包含各种不同的设置和选项&#xff0c;根据实际情况&#xff0c;可以根据需要添加或删除配置。以下是一个包含各种可能设置的示例。 这个配置文件包含了环境设置、数…

详细解析POI 和 EasyExcel

在数据量需要被批量导入、导出的时候&#xff0c;就可以使用POI和easyExcel 常用场景&#xff1a; 1、将用户信息导出为excel表格(导出数据…) 2、将Excel表中的信息录入到网站数据库&#xff08;习题上传…&#xff09;大大减轻网站录入量!开发中经常会设计到excel的处理&am…

Unity中Shader平移变换

文章目录 前言方式一&#xff1a;对顶点本地空间下的坐标进行相加平移1、在属性面板定义一个四维变量记录在 xyz 上平移多少。2、在常量缓冲区进行申明3、在顶点着色器中&#xff0c;在进行其他坐标转化之前&#xff0c;对模型顶点本地空间下的坐标进行转化4、我们来看看效果 方…

卷积层里的多输入与多输出通道(channel)

目录 一、多输入输出通道 1、多输入通道 2、多输出通道 3、11卷积层 4、二维卷积层的计算复杂度 5、总结 二、代码实现 1、多输入通道 2、多输出通道 3、11卷积层 4、总结 一、多输入输出通道 1、多输入通道 下图是多输入通道、单输出通道的情况&#xff1a;每个通道…

.NET 药厂业务系统 CPU爆高分析

Windbg 分析 1. CPU 真的爆高吗 还是老规矩&#xff0c;要想找到这个答案&#xff0c;可以使用 !tp 命令。 0:044> !tp logStart: 1 logSize: 200 CPU utilization: 88 % Worker Thread: Total: 8 Running: 4 Idle: 4 MaxLimit: 1023 MinLimit: 4 Work Request in Queue: …

翻译: 负责任的人工智能 Responsible AI

负责任的人工智能指的是以道德、值得信赖和社会负责任的方式开发和使用人工智能。许多开发者、企业和政府都关心这一点&#xff0c;并且一直在进行对话&#xff0c;也在努力确保人工智能的构建和使用是负责任的。由于对负责任的人工智能的所有这些关注和努力&#xff0c;我们在…

网线制作,集线器、交换机、路由器的介绍以及路由器的设置

目录 一. 网线制作 1.1 制作材料 1.2 网线标准 1.3 网线做法 二. 集线器、交换机、路由器介绍 前言 简介 简单来说 三. 路由器的设置 设置1 设置2 设置3 设置4 无线设置 一. 网线制作 1.1 制作材料 网线 …

【进阶篇】YOLOv8实现K折交叉验证——解决数据集样本稀少和类别不平衡的难题,让你的模型评估更加稳健

YOLOv8专栏导航&#xff1a;点击此处跳转 K折交叉验证 K折交叉验证&#xff08;K-Fold Cross-Validation&#xff09;是一种常用的机器学习模型评估方法&#xff0c;可以帮助我们评估模型的性能&#xff0c;特别适用于数据集相对较小的情况。 在K折交叉验证中&#xff0c;将原…

CUMT--Java--JDBC编程

目录 一、JDBC简介 二、数据库访问 1、加载数据库驱动 2、建立数据连接 3、创建Statement对象 4、执行SQL语句 5、访问结果集 三、MetaData接口 1、DatabaseMetaData接口 2、ResultSetMetaData接口 四、事务 1、JDBC中的事务 2、保存点 3、批量更新 一、JDBC简…

若依(ruoyi)管理系统标题和logo修改

1、网页上的logo 2、页面中的logo 进入ruoyi-ui --> src --> assets --> logo --> logo.png&#xff0c;把这个图片换成你自己的logo 3、网页标题 进入ruoyi-ui --> src --> layout --> components --> Sidebar --> Logo.vue&#xff0c;将里面的…

第二周:AI产品经理全局学习

一、AI产品架构全景 二、 AI产品岗位分析和了解 三、 AI产品能力模型 四、AI产品经理工作流 五、AI产品经理学习路径和规划 六、本周市场动态

VM安装Sonoma【笔记】

VMware Workstation安装MacOS Sonoma 1、配置虚拟机&#xff0c;根据系统性能调整参数&#xff1b; 2、先不焦急启动虚拟机&#xff0c;打开虚拟机存储目录&#xff0c;以文本方式打开.vmx文件&#xff08;这里以Sonoma.vmx为例&#xff09;&#xff1b; 这里只针对Inter CP…

select和poll

slelect实现客户端 #include <myhead.h> #define PORT 8888 #define PORT1 9999 #define IP "192.168.125.147" int main(int argc, const char *argv[]) {int cfd-1;if((cfdsocket(AF_INET,SOCK_STREAM,0))-1){perror("socket error");return -1…

Go语言字符串综合指南:函数、方法和最佳实践

Go语言字符串综合指南&#xff1a;函数、方法和最佳实践 引言Go语言字符串基础声明和初始化不可变性字符串长度 字符串操作函数常用字符串操作转换与解析示例连接分割包含关系替换大小写转换整数与字符串的转换字符串到整数的转换格式化与解析 字符串与字符切片字符串和字符切片…

WINDOWS(WIN11)通过IP添加网络打印机

点击添加设备 点击手动添加 使用IP地址或主机名添加打印机 选择TCP/IP设备&#xff0c;输入打印机地址 如果有正确驱动就安装&#xff0c;没有就取消。 通过手动设置添加本地打印机或网络打印机 使用现有的端口 根据打印机IP&#xff0c;选择标准端口。 成功&#xff01; 到…