【小白学习C++ 教程】十四、C++ 中预处理器
@Author:Runsen
预处理器程序提供预处理器指令,它告诉编译器在编译之前对源代码进行预处理。
所有这些预处理器指令都以“#
”符号开头。’#
’ 符号表示任何以# 开头的语句都将进入预处理程序,预处理程序将执行该语句。
一些预处理器指令的实例为:#include, #define, #ifndef
,
- 宏
- 文件包含
- 条件编译
- 其他指令
例如,#include
将在程序中包含额外的代码。我们可以将这些预处理器指令放在C++程序的任何地方。
宏
现在让我们详细了解这些指令中的每一个。
宏:宏是程序中的一段代码。每当编译器遇到此名称时,编译器都会用实际的代码段替换该名称。’#define
’ 指令用于定义宏。现在让我们在程序的帮助下理解宏定义:
#include <iostream>// 宏
#define LIMIT 5
int main()
{for (int i = 0; i < LIMIT; i++) {std::cout << i << "\n";}return 0;
}
在上面的程序中,当编译器执行单词LIMIT
时,它用5 替换它。宏定义中的单词’LIMIT’ 称为宏模板,‘5’ 是宏扩展。
注意:宏定义末尾没有分号(’;’)。宏定义不需要分号结束。
带参数的宏:我们也可以将参数传递给宏。使用参数定义的宏与函数的工作方式类似。让我们通过一个程序来理解这一点:
#include <iostream>// 带参数的宏
#define AREA(l, b) (l * b)
int main()
{int l1 = 10, l2 = 5, area;area = AREA(l1, l2);std::cout << "Area of rectangle is: " << area; //50return 0;
}
在上面的程序,每当编译器在程序中找到AREA(l, b)
时,它就会用语句 (l*b)
替换它。不仅如此,传递给宏模板 AREA(l, b)
的值也将在语句 (l*b)
中被替换。因此 AREA(10, 5) 将等于 10*5。
文件包含
文件包含:这种类型的预处理器指令告诉编译器在源代码程序中包含一个文件。
用户可以在程序中包含两种类型的文件: 头文件或标准文件。
这些文件包含预定义函数的定义,如 printf()、scanf()
等。必须包含这些文件才能使用这些函数。不同的函数在不同的头文件中声明。例如,标准 I/O 函数在C++ 中的 ‘iostream
’ 文件中,而执行字符串操作的函数在 ‘string
’ 文件中。
语法:#include<file_name>
其中file_name是要包含的文件的名称。'<'
和'>'
括号告诉编译器在当前目录中查找文件。
条件编译
条件编译:条件编译指令是一种指令,可帮助编译程序的特定部分或根据某些条件跳过程序某些特定部分的编译。这可以在两个预处理命令“ ifdef
”和“ endif
”的帮助下完成。
#ifdef macroname 程序段1
#else程序段2
#endif
条件编译选项:#if #ifdef #ifndef #else #elsif #end
这些以#号开头的定义称作条件编译表达式,满足其条件的内容会被编译到预处理的源代码文件中,而不满足条件的内容不会被编译到预处理的源代码中。例如:
#define TEST 1
#if TEST == 1int a = 1;
#elseint a = 2;
#endif
其他指令
除了上述指令外,还有两个不常用的指令。
这些是:
#undef
指令:#undef
指令用于取消定义现有的宏。该指令的作用是:
#undef LIMIT
使用此语句将取消定义现有的宏 LIMIT。在此语句之后,每个“#ifdef LIMIT
”语句都将评估为 false。
#pragma Directive
:该指令是一个特殊用途的指令,用于打开或关闭某些功能。这种类型的指令是特定于编译器的,即它们因编译器而异。
#pragma startup
和#pragma exit
:这些指令帮助我们指定在程序启动之前(在控制传递给 main() 之前)和程序退出之前(就在控制从 main() 返回之前)
#include <iostream>
using namespace std;void func1();
void func2();#pragma startup func1
#pragma exit func2void func1()
{cout << "Inside func1()\n";
}void func2()
{cout << "Inside func2()\n";
}int main()
{void func1();void func2();cout << "Inside main()\n";return 0;
}Inside func1()
Inside main()
Inside func2()
上面的程序不适用于 GCC 编译器,当在 GCC 编译器上运行时,上面的代码将产生如下输出:
Inside main()
因为 GCC 不支持 #pragma
启动或退出。
Code:创建函数来检查素数
#include <iostream>
using namespace std;bool checkPrimeNumber(int);int main() {int n;cout << "Enter a positive integer: ";cin >> n;if (checkPrimeNumber(n))cout << n << " is a prime number.";elsecout << n << " is not a prime number.";return 0;
}bool checkPrimeNumber(int n) {bool isPrime = true;// 0 and 1 are not prime numbersif (n == 0 || n == 1) {isPrime = false;}else {for (int i = 2; i <= n / 2; ++i) {if (n % i == 0) {isPrime = false;break;}}}return isPrime;
}
【小白学习C++ 教程】十四、C++ 中预处理器相关推荐
- 【小白学习tensorflow教程】四、使用 tfhub中的模型EfficientDet-Lite2 进行对象检测
@Author:Runsen tfhub是tensorflow官方提供训练好的模型的一个仓库.今天,我使用 tfhub中的模型EfficientDet-Lite2 进行对象检测 选择的模型是Effic ...
- 【小白学习PyTorch教程】四、基于nn.Module类实现线性回归模型
「@Author:Runsen」 上次介绍了顺序模型,但是在大多数情况下,我们基本都是以类的形式实现神经网络. 大多数情况下创建一个继承自 Pytorch 中的 nn.Module 的类,这样可以使用 ...
- 【小白学习C++ 教程】四、C++逻辑运算符、While循环和For 循环
@Author:Runsen 文章目录 逻辑运算符 While循环 For 循环 逻辑运算符 逻辑运算符用于组合两个或多个条件.它们允许程序做出更灵活的决策.逻辑运算符的运算结果是或的bool值.tr ...
- java nio oio_Java NIO框架Netty教程(十四) Netty中OIO模型(对比NIO)
Netty中不光支持了Java中NIO模型,同时也提供了对OIO模型的支持.(New IO vs Old IO). 首先,在Netty中,切换OIO和NIO两种模式是非常方便的,只需要初始化不同的Ch ...
- java nio oio_Java NIO框架Netty教程(十四)-Netty中OIO模型(对比NIO)
OneCoder这个周末搬家,并且新家目前还没有网络,本周的翻译的任务尚未完成,下周一起补上,先上一篇OIO和NIO对比的小研究. Netty中不光支持了Java中NIO模型,同时也提供了对OIO模型 ...
- 【小白学习Keras教程】四、Keras基于数字数据集建立基础的CNN模型
@Author:Runsen 文章目录 基本卷积神经网络(CNN) 加载数据集 1.创建模型 2.卷积层 3. 激活层 4. 池化层 5. Dense(全连接层) 6. Model compile & ...
- akka学习教程(十四) akka分布式实战
akka系列文章目录 akka学习教程(十四) akka分布式实战 akka学习教程(十三) akka分布式 akka学习教程(十二) Spring与Akka的集成 akka学习教程(十一) akka ...
- 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...
- Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议
Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议 原文:Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议 在上一篇中,留下了许可协议的问题,目前已经解决.感谢网友武全的指点 ...
- 虚拟内存——Windows核心编程学习手札之十四
虚拟内存 --Windows核心编程学习手札之十四 系统信息 有些操作系统的值是根据主机而定的,如页面大小.分配粒度大小等,这些值不用硬编码形式,进程初始化时应检索这些值以使用.函数GetSystem ...
最新文章
- ggplot2:9绘图需要的数据整理技术-数据转换
- 姚殊清华计算机科学与技术,王道顺(清华大学计算机科学与技术系副教授)_百度百科...
- Hadoop Map/Reduce教程
- 高层管理者对于大数据的6个误解
- Spring 操作数据库
- 保持危机感和紧迫感_什么是紧迫的:您需要知道的一切
- 【渝粤教育】电大中专Office办公软件 (4)作业 题库
- 二、Get和Post的区别
- 计算机系统安装要点,电脑重新装系统要注意哪些要点 重装系统时的六大事项...
- Git warning:LF will be replaced by CRLF in readme.txt的原因与解决方案
- hdu 6015 Gameia(树上博弈)
- 阿里云服务器的安全组怎么创建和修改?
- 我和linux的第十三天
- 波利亚-怎样解题的思考
- vue中使用富文本编辑器
- 进销存系统(1):开源ECP编译安装
- 电脑知识 - bin文件夹是什么
- 【CloudShell】阿里云壳EDR卸载指南
- Android:圆形头像
- CSV文件如何使用EXCEL打开
热门文章
- TCP/IP / 三次握手之状态转换图和原因
- C51对标准C语言的扩展 / 数据类型
- 元宵节快乐 | 启明云端邀您一起猜灯谜了
- 员工转正申请书_员工有了归属感 企业实现大发展!通机股份在党工共建中摸索经验...
- c语言从集合中随机选取一个值,从集合中挑选一个随机元素
- vue引入外部文件_vue文件中引入外部js
- 一文带你认识Spring事务
- Arch Linux中安装Anaconda
- 利用std::allocator实现自定义的vector类
- BI Content、Metadata Repository