【C++上层应用】2. 预处理器

news2024/9/20 8:52:51

文章目录

  • 【 1. #define 预处理 】
  • 【 2. #ifdef、#if 条件编译 】
    • 2.1 #ifdef
    • 2.2 #if
    • 2.3 实例
  • 【 3. # 和 ## 预处理 】
    • 3.1 # 替换预处理
    • 3.2 ## 连接预处理
  • 【 4. 预定义宏 】

  • 预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。
  • 所有的预处理器指令都是以 井号 # 开头,只有空格字符可以出现在预处理指令之前。
  • 预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。

【 1. #define 预处理 】

  • #define 预处理指令用于创建符号常量,该符号常量通常称为 宏 / Macro
  • 指令的一般形式是:
#define Macro_Name Replacement_Value

当这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 Replacement_Value。

  • 实例
#include <iostream>
using namespace std;

#define PI 3.14159

int main ()
{

    cout << "Value of PI :" << PI << endl; 

    return 0;
}

在这里插入图片描述

  • 我们可以使用 #define 来定义一个 带有参数的宏 。如下实例:
#include <iostream>
using namespace std;

#define MIN(a,b)  (a<b ? a : b)

int main ()
{
   int i, j;
   i = 100;
   j = 30;
   cout <<"较小的值为:" << MIN(i, j) << endl;

    return 0;
}

在这里插入图片描述

【 2. #ifdef、#if 条件编译 】

  • 条件编译:即有选择地对部分程序源代码进行编译。如下所示为条件预处理器的一般结构:

2.1 #ifdef

#ifdef NULL
   #define NULL 0
#endif
  • 我们可以只在调试时进行编译,调试开关可以使用一个宏来实现:如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译。
#ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
#endif

2.2 #if

我们可以 使用 #if 0 语句注释掉程序的一部分,使得该块代码不被编译不被执行相当于被注释掉,如下所示:

#if 0
   不进行编译的代码
#endif

2.3 实例

#include <iostream>
using namespace std;

#define DEBUG
#define MIN(a,b) (((a)<(b)) ? a : b)

int main ()
{
	int i, j;
	i = 100;
	j = 30;
	
	#ifdef DEBUG
		cerr <<"Trace: Inside main function" << endl;
	#endif

	#if 0
		/* 这是注释部分 */
		cout << MKSTR(HELLO C++) << endl;
	#endif

	cout <<"The minimum is " << MIN(i, j) << endl;

	#ifdef DEBUG
		cerr <<"Trace: Coming out of main function" << endl;
	#endif
    return 0;
}

在这里插入图片描述

【 3. # 和 ## 预处理 】

  • #和 ## 预处理运算符在 C++ 和 ANSI/ISO C 中都是可用的。

3.1 # 替换预处理

  • 实例:C++ 预处理器把 cout << MKSTR(HELLO C++) << endl; 替换为 cout << “HELLO C++” << endl;
#include <iostream>
using namespace std;

#define MKSTR( x ) #x

int main ()
{
    cout << MKSTR(HELLO C++) << endl;

    return 0;
}

在这里插入图片描述

3.2 ## 连接预处理

  • ##运算符用于连接两个令牌。
  • 例如:#define CONCAT( x, y ) x ## y
    当 CONCAT 出现在程序中时,它的参数会被连接起来,并用来取代宏。例如,程序中 CONCAT(HELLO, C++) 会被替换为 “HELLO C++”,如下面实例所示。
  • 实例:C++ 预处理器把 cout << concat(x, y); 转换成了cout << xy; 。
#include <iostream>
using namespace std;

#define concat(a, b) a ## b

int main()
{
   int xy = 100;

   cout << concat(x, y);
   return 0;
}

在这里插入图片描述

【 4. 预定义宏 】

  • 我们已经看到,之前所有的实例中都有 #include 指令,这个宏用于把头文件包含到源文件中。
  • C++ 提供了下表所示的一些预定义宏:
描述
LINE这会在程序编译时包含当前行号。
FILE这会在程序编译时包含当前文件名。
DATE这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
TIME这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。
  • 实例:
#include <iostream>
using namespace std;

int main ()
{
    cout << "Value of __LINE__ : " << __LINE__ << endl;
    cout << "Value of __FILE__ : " << __FILE__ << endl;
    cout << "Value of __DATE__ : " << __DATE__ << endl;
    cout << "Value of __TIME__ : " << __TIME__ << endl;

    return 0;
}

在这里插入图片描述

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

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

相关文章

Chat GPT 用于论文润色,常用指令这里都全了

ChatGPT在多个方面对科研人员提供帮助&#xff0c;其中之一就是SCI论文润色&#xff0c;通过输入论文的摘要、引言或者段落&#xff0c;科研人员可获得ChatGPT生成的回复&#xff0c;包括修改建议、语法纠正、表达方式优化等。 指令润色 比如&#xff1a; 请帮我润色论文&am…

我叫:插入排序【JAVA】

1.自我介绍 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置&#xff0c;以达到排序的目的。 2.继承我的思想 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包…

SSD主控

《深入浅出SSD》学习中… 文章目录 《深入浅出SSD》学习中.....一、SSD主控二、PCIe和NVMe控制器前端子系统1.PCIe控制器2.NVMe控制器 一、SSD主控 就是类似电脑CPU的东西&#xff0c;在SSD中收取处理Host端的命令&#xff0c;管理NAND闪存 二、PCIe和NVMe控制器前端子系统 主…

2024中国人民大学计算机考研分析

24计算机考研|上岸指南 中国人民大学 中国人民大学计算机考研招生学院是信息学院。目前均已出拟录取名单。 中国人民大学在1978年创立了经济信息管理系&#xff0c;它是国内最早建立的将数学与信息技术在经济管理领域应用为特色的系科。1986年&#xff0c;在原系计算站的基础…

[计算机网络]网络层概述

呼,写了这么久终于重新开始啦! 自己落下了太多东西了.....是时候应该重新拾掇起来了. 关于后面的代码项目,我的想法是vilas.js仍然使用js来进行编写,但是后续其他的项目会开始尝试使用ts来进行书写了. 就算是前端也需要点规范吧..... 0.写在前面 这篇文章要和大家道个歉,首…

Flutter 使用 device_info_plus 遇到的问题

问题&#xff1a;引用device_info_plus 插件出现了异常&#xff0c;不知道为啥打开项目的时候就不能用了。 解决&#xff1a;改了版本解决 Target of URI doesnt exist: package:device_info_plus/device_info_plus.dart. (Documentation) Try creating the file reference…

每天学习一点点之 Spring Web MVC 之抽象 HandlerInterceptor 实现常用功能(限流、权限等)

背景 这里介绍一下本文的背景&#xff08;废话&#xff0c;可跳过&#xff09;。上周有个我们服务的调用方反馈某个接口调用失败率很高&#xff0c;排查了一下&#xff0c;发现是因为这个接口被我之前写的一个限流器给拦截了&#xff0c;随着我们的服务接入了 Sentinel&#x…

【数据结构(三)】单向环形链表和约瑟夫问题(3)

文章目录 1. 单向环形链表应用场景2. 思路分析3. 代码实现3.1. 实现单向环形链表3.2. 产生出队编号序列3.2.1. 思路分析3.2.2. 代码实现 1. 单向环形链表应用场景 Josephu(约瑟夫、约瑟夫环) 问题&#xff1a; 设编号为 1&#xff0c;2&#xff0c;… n 的 n 个人围坐一圈&…

电容的耐压值是什么意思呢?

电容是什么&#xff1f; 电容是一种能以电荷的形式储存能量的装置。与同样大小的电池相比&#xff0c;电容能储存的能量要小得多&#xff0c;大约1w个电容存储的能量才顶一节电池存储的能量&#xff0c;但对于许多电路设计来说却足够使用了。 看下图的直插式电容&#xff0c;…

【推荐】智元兔AI:一款集写作、问答、绘画于一体的全能工具!

在当今技术飞速发展的时代&#xff0c;越来越多的领域开始应用人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;。其中&#xff0c;AI写作工具备受瞩目&#xff0c;备受推崇。在众多的选择中&#xff0c;智元兔AI是一款在笔者使用过程中非常有帮助的…

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1)

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法&#xff08;1&#xff09; 单字节写时序单字节读时序I2C 控制器设计模块框图scl_high 和 scl_low 产生的时序图状态转移图 Verilog代码 FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法&#xff08;1&#xff09; FPG…

[Kettle] 生成记录

在数据统计中&#xff0c;往往要生成固定行数和列数的记录&#xff0c;用于存放统计总数 需求&#xff1a;为方便记录1~12月份商品的销售总额&#xff0c;需要通过生成记录&#xff0c;生成一个月销售总额的数据表&#xff0c;包括商品名称和销售总额两个字段&#xff0c;记录…

pycharm2023 实现鼠标点击某行,调试时代码运行至相应行

按下图取消 Breakpoints Over Line Numbers即可&#xff0c;然后调试时点击某行&#xff0c;代码就会运行至某行

变量命名的规则与规范

变量命名的规则与规范 变量命名的规则不能使用关键字字母须区分大小写由字母、数字、_、$组成&#xff0c;且不能以数字开头 变量命名的规范起名须有一定的意义遵守小驼峰命名法 变量命名的规则 不能使用关键字 在JavaScript中声明变量不能使用JavaScript的常用关键字&#x…

利用AlphaMissense准确预测蛋白质组范围内的错义变体效应

Editor’s summary 蛋白质中单个氨基酸的变化有时影响不大&#xff0c;但通常会导致蛋白质折叠、活性或稳定性方面的问题。只有一小部分变体进行了实验研究&#xff0c;但有大量的生物序列数据适合用作机器学习方法的训练数据。程等人开发了AlphaMissense&#xff0c;这是一种…

STM32 SPI

SPI介绍 SPI是Serial Pepheral interface缩写&#xff0c;串行外围设备接口。 SPI接口是一种高速的全双工同步通信总线&#xff0c;已经广泛应用在众多MCU、存储芯片、AD转换器和LCD之间。大部分STM32有3个SPI接口&#xff0c;本实验使用的是SPI1。 SPI同一时刻既能发送数据&…

【23真题】很少见!第6题有点新颖!

今天分享的是23年太原理工大学801的信号与系统试题及解析。 本套试卷难度分析&#xff1a;该学校考察数字电路和信号与系统两部分&#xff0c;数字电路我没有知道&#xff0c;所以不知道难度。但是从信号部分来看&#xff0c;考察的知识点非常常见&#xff0c;对信号时域和频域…

建设城市排水管网监测系统的作用及功能说明

排水管网是由管道、井盖、降水口等组成的系统&#xff0c;用于将城市和建筑物内的污水和降水排放到污水处理厂或主干管道中。排水管网通常包括雨水管网和污水管网两部分。雨水管网用于收集雨水、路面洒水和冷却水等&#xff0c;而污水管网则负责收集排放到厕所、洗涤或过程中产…

Vue3 常用组件

一、Fragment组件 Vue2 的template 模板中必须要有一个根标签&#xff0c;而我们在Vue3 的模板中不需要使用根标签就能渲染&#xff0c;因为Vue3 在内部会将多个标签包含在一个Fragment 虚拟元素中。 好处就在于可以减少标签的层级&#xff0c;减小内存占用。 二、Teleport组…

23.11.19日总结(vue2和vue3的区别,项目中期总结)

经过昨天的中期答辩&#xff0c;其实可以看出来项目进度太慢了&#xff0c;现在是第十周&#xff0c;预计第十四周是终级答辩&#xff0c;在这段时间要把项目写完。 前端要加上一个未登录的拦截器&#xff0c;后端加上全局的异常处理。对于饿了么项目的商品建表&#xff0c;之前…