C++系列九:预处理功能

news2024/11/26 14:39:05

预处理功能

    • 1. 宏定义
    • 2. 文件包含
    • 3. 条件编译
    • 4. 代码注释
    • 5. 预处理器注意事项
    • 6. 总结

预处理器是 C++ 编译器提供的一个工具,允许程序员在编译之前对源代码文件做出修改。它主要是根据在代码中命名实体的定义(如宏、条件编译指令)、源文件调用等操作指令,生成一个新的源代码文件,以交给编译器进行编译。预处理器通常会将 # 开头的指令与代码区别开来,并专门处理指令。

1. 宏定义

宏定义是一种可以简化代码的方式,可以用一个标识符代替一段代码。

e.g.

#define PI 3.14159

在代码中使用宏定义时,宏名称将被替换为其对应的值。

double radius = 5.0;
double area = PI * radius * radius;

在这个示例中,PI宏名称被替换为其对应的值3.14159,计算结果为78.53975。

宏定义也可以包括参数,类似于函数调用。

e.g.

#define MIN(x, y) (x < y ? x : y)

在这个示例中,MIN宏定义包含两个参数x和y,返回两者中的最小值。在代码中使用时,实际参数将被替换为x和y。

int x = 3, y = 7;
int min_val = MIN(x, y);

在这个示例中,MIN(x, y)被替换为(x < y ? x : y),计算结果为3。需要注意的是,宏定义不会进行类型检查,因此需要谨慎使用。

2. 文件包含

C++预处理器还提供了文件包含功能,可以将一个文件的内容插入到另一个文件中。文件包含使用#include指令实现。

e.g.

#include "myheader.h"

在这个示例中,myheader.h文件的内容将被插入到当前文件中。需要注意的是,#include指令有两种形式,一种是用双引号来包围文件名,表示在当前目录和编译器指定的目录中寻找文件;另一种是用尖括号来包围文件名,表示只在编译器指定的目录中寻找文件。

3. 条件编译

C++预处理器提供了条件编译指令,可以根据条件来选择性地编译代码。这些指令通常被用于编写跨平台程序,在不同的环境下使用不同的代码。

e.g.

#ifdef _WIN32
    // Windows-specific code
#elseif defined(__linux__)
    // Linux-specific code
#else
    #error "Unsupported platform"
#endif

在这个示例中,#ifdef指令检查是否定义了_WIN32宏,如果宏已定义,则编译Windows特定的代码。否则,#elseif指令检查是否定义了__linux__宏,如果宏已定义,则编译Linux特定的代码。最后,如果都没有满足,则会产生一个编译错误提示信息。

除了#ifdef#elseif指令外,还有#ifndef#else指令,它们用于在未定义宏时编译代码。

e.g.

#ifndef _MY_HEADER_H_
#define _MY_HEADER_H_
// Header file code
#endif

在这个示例中,#ifndef指令检查是否未定义了_MY_HEADER_H_宏,如果未定义,则编译头文件代码,并定义宏。否则,将跳过头文件代码。

4. 代码注释

C++预处理器还支持代码注释功能,可以用于快速注释掉一段代码或者将其解除注释。注释使用/*...*/或者//符号实现。

e.g.

/* This is a comment */
int x = 3; // This is another comment

在这个示例中,第一行是使用/*...*/符号的注释,第二行是使用//符号的注释。需要注意的是,/*...*/注释可以跨越多行,而//注释只能占据一行。

5. 预处理器注意事项

尽管预处理器可以为提供很多便利,但是使用不当很容易导致意想不到的问题。以下是一些需要注意的地方:

  • 宏定义变量名或函数名时要谨慎,避免与其他标识符冲突。
  • 避免滥用宏定义,因为宏定义是字符串替换,可能会影响程序的可读性和可维护性。
  • 尽量不要使用预处理器语句包含复杂或长代码块,应该把它们放到独立的函数或模板中,在代码中调用。
  • 条件编译中,不能重复定义同样名称的宏变量等,否则可能出现编译错误或者运行时异常。

6. 总结

20年前学习C++语言的幼稚记录

在这里插入图片描述

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

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

相关文章

分布函数有什么意义?

累积分布函数&#xff08;CDF&#xff09;有什么意义&#xff1f; 参考文献&#xff1a;姜咏梅. 浅析分布函数的意义与应用[J]. 科学与财富,2014(10):207-207,208. DOI:10.3969/j.issn.1671-2226.2014.10.183. 关于PMF、PDF、CDF的介绍&#xff0c;移步至我的笔记&#xff1a…

【SPSS】因子分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 因子分析 因子分析案例 因子分析

Clion开发STM32之OTA升级模块(一)

什么是OTA 百度百科解释个人理解&#xff1a;就是不通过烧录的方式&#xff0c;通过串口、网口、无线对主板运行的程序进行升级。减少后期的一个维护迭代程序的一个成本。 STM32的OTA升级模块的一个设计 程序启动的一个框架流程图(大致流程) FLASH的一个划分框图 BootLoader…

Nautilus Chain 或成未来最好的链上隐私生态

Nautilus Chain 目前仍旧处于测试网阶段&#xff0c;作为目前行业内首个&#xff0c;也是最受关注的 Layer3 模块化链&#xff0c;Nautilus Chain 在测试网早期阶段&#xff0c;整体就有着十分出色的数据表现。而该链有望在 6 月上线主网&#xff0c;面向更为广泛的开发者、用户…

分布式数据库设计与实现

分布式数据库设计与实现 摘要背景二期项目包括数据库选型分布式数据库设计数据集成测试部署分布式数据库扩展阅读 摘要 : 本文论述《金蚕工程》的分布式数据库的设计和实现。该项目的设计目标是实现企业间茧、丝等的合同交易&#xff08;交易规则和期货交易一样&#xff09;、…

【springcloud 微服务】springcloud openfeign使用详解

目录 一、前言 二、openfeign介绍 2.1 openfeign介绍 2.2 openfeign优势 三、Spring Cloud Alibaba整合OpenFeign 3.1 前置准备 3.2 代码整合过程 3.2.1 添加feign依赖 3.2.2 添加feign接口类 3.2.3 调整调用的方法 3.2.4 核心配置文件 3.2.5 接口模拟测试 四…

libevent介绍和使用

libevent介绍 libevent 是一个开源的事件通知库&#xff0c;它提供了一个跨平台的抽象接口&#xff0c;libevnet处理的事件包括网络IO事件&#xff0c;定时事件以及信号事件。它可以在不同的操作系统上使用&#xff0c;包括Linux、Windows和Mac OS X等。libevent 的主要目的是…

最全面的ChatGPT镜像网址:值得三连~~~

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…

69.建立手风琴组件第二部分

上节课我们构建了下图一样的基本样式&#xff0c;这节课我们来构建布局&#xff01; ● 建立阴影&#xff0c;并生成grid布局 .item {box-shadow: 0 0 32px rgba(0,0,0,0.1);#添加外阴影&#xff0c;为半透明黑色&#xff0c;大小为0&#xff0c;0&#xff0c;32pxpadding: 24p…

C++编译Boost库读写和解析JSON文件和XML文件(2023.5.14)

C编译Boost读写并解析JSON文件和XML文件 需求分析前提环境&#xff08;Win11、VS 2015&#xff09;1、Boost简介1.1 为何使用Boost&#xff1f;1.2 Boost快速上手&#xff08;Windows系统&#xff09; 2、Boost 安装和使用2.1 自己下载源码编译生成Boost库(v 1.82.0)2.2 从官网…

基于微信平台教务管理系统的设计与实现(论文+源码)_kaic

摘 要 网络技术的快速发展也使得越来越多的研究学者将计算机技术应用到停车、医疗、商业、旅游等各行各业&#xff0c;这些传统行业在计算机技术的催动下&#xff0c;正在快速发展。为了顺应时代发展的变化&#xff0c;将计算机技术应用到教务管理领域显得极为重要。 本文设计…

哈希表+unordered_map封装

目录 1&#xff1a;hashtable.h 2&#xff1a;unordered_map.h 3&#xff1a;unordered_set 4&#xff1a;讲解 1&#xff1a;hashtable.h #pragma once #include<vector> using namespace std; namespace OpenAdress {enum State{EXIST,DELETE,EMPTY,};template<c…

redis淘汰策略

8种淘汰策略 volatile-lru&#xff0c;针对设置了过期时间的key&#xff0c;使用lru算法进行淘汰。 allkeys-lru&#xff0c;针对所有key使用lru算法进行淘汰。 volatile-lfu&#xff0c;针对设置了过期时间的key&#xff0c;使用lfu算法进行淘汰。 allkeys-lfu&#xff0c;针…

『C++』特殊类设计

「前言」文章是关于C特殊类设计方面的 「归属专栏」C嘎嘎 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 一点浩然气&#xff0c;千里快哉风。 ——苏轼《水调歌头黄州快哉亭赠张偓佺》 目录 一、请设计一个类&#xff0c;不能被拷贝 …

IDEA开发实现Maven+Servlet+Mybatis实现CRUD管理系统-Mapper代理开发

Mapper代理开发概述 之前我们写的代码是基本使用方式&#xff0c;它也存在硬编码的问题&#xff0c;如下&#xff1a; 这里调用 selectList() 方法传递的参数是映射配置文件中的 namespace.id值。这样写也不便于后期的维护。如果使用 Mapper 代理方式&#xff08;如下图&…

stm32之hal库学习(3)---STM32 启动模式分析

启动模式 我们知道的复位方式有三种&#xff1a;上电复位&#xff0c;硬件复位和软件复位。当产生复位&#xff0c;并且离开复 位状态后&#xff0c;CM3 内核做的第一件事就是读取下列两个 32 位整数的值&#xff1a; &#xff08;1&#xff09;从地址 0x0000 0000 处取出堆栈…

Linux基本指令----下

Linux基本指令----下 date指令cal指令find指令which指令whereis指令grep指令du指令zip/unzip指令tar指令bc指令uname -r指令关机指令重要热键结语 date指令 语法&#xff1a; date 指定格式显示时间&#xff1a; date %Y:%m:%d&#xff0c;date 用法&#xff1a;date [OPTION]…

【FPGA零基础学习之旅#5】产生非等占空比信号

&#x1f389;欢迎来到FPGA专栏~产生非等占空比信号 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

字节跳动 测试开发工程师 面试总结,小伙伴可以参考一下

目录 一面 二面 三面 个人总结&#xff1a; 一面 自我介绍 操作系统 虚拟内存的概念 进程和线程 线程同步 如何实现线程同步 计算机网络 说一下TCP 为什么是四次挥手呢 说一个ip地址&#xff0c;如果第一字节是269行不行 说一下HTTP&#xff08;自己讲了GET POST&…

[abc复盘] abc301 20230514

[abc复盘] abc301 20230514 总结A - Overall Winner1. 题目描述2. 思路分析3. 代码实现 B - Fill the Gaps1. 题目描述2. 思路分析3. 代码实现 C - AtCoder Cards1. 题目描述2. 思路分析3. 代码实现 D - Bitmask1. 题目描述2. 思路分析3. 代码实现 E - Pac-Takahashi1. 题目描…