「C/C++」C/C++预处理器

news2025/1/24 8:41:33

在这里插入图片描述

博客主页:何曾参静谧的博客
文章专栏:「C/C++」C/C++学习

目录

  • 一、宏替换 #define
    • 1. 定义常量
    • 2. 定义函数
    • 3. 定义代码块
  • 二、条件编译 #if
    • 1. 使用 `#ifdef` 和 `#endif` 编译不同平台的代码
    • 2. 使用 `#if` 和 `#else` 编译不同版本的代码
    • 3. 使用 `#ifndef` 和 `#define`和`#endif`防止头文件重复包含
  • 三、头文件包含 #include <>
    • 1. 头文件两种写法
    • 2.C语言头文件
    • 3.C++常用头文件


一、宏替换 #define

宏是一种预处理器指令,它可以将一些代码片段或者常量直接替换为另一些内容,在编译过程中被展开为相应的代码或者值。通过定义宏,我们可以简化编写代码的工作量,并且通过修改宏的定义,可以方便地进行代码的修改。例如,我们可以使用#define来定义宏:

注意事项:

  • 宏定义的名称通常使用大写字母,并使用下划线来分隔单词。
  • 宏定义必须以 #define 开头,定义的常量、函数、代码块等必须是合法的C语句。
  • 宏定义可以包含参数,从而使得宏可以在不同的场景下进行重用。
  • 宏定义可以使用反斜杠(\)对代码进行换行,以便于阅读和维护。
  • 宏定义在代码被编译之前就会被预处理器处理,所以宏定义是一种文本替换的手段,替换的过程是简单的字符串替换,因此要特别注意宏定义带来的潜在问题,比如优先级、参数的多次计算等等。

1. 定义常量

这个宏定义了一个名为 PI 的常量,并将其值设定为 3.1415926。

#define PI 3.1415926

2. 定义函数

这个宏定义了一个名为 MAX 的函数,并使用三目运算符定义了其功能,即返回两个参数中的较大值。

#define MAX(a, b) ((a) > (b) ? (a) : (b))

3. 定义代码块

在预处理过程中,宏会被直接替换成相应的值,例子中PI会被替换成3.14159,MAX(a,b)会被替换成((a)>(b)?(a):(b))。

#define DO_SOMETHING { \
    printf("Hello, "); \
    printf("world!"); \
}

二、条件编译 #if

条件编译是一种预处理技术,可以根据一些特定条件来决定编译哪些代码,从而实现不同平台、不同版本程序的定制。 预处理器提供了一些指令用于条件编译,如#if、#ifdef、#ifndef、#else以及#endif等。这些指令可以方便地控制代码的编译。例如:#include<stdio.h>、#include"stdio.h"

指令作用
#ifdef如果定义了某个宏,则编译下面的代码。
#ifndef如果没有定义某个宏,则编译下面的代码。
#if根据条件编译下面的代码。
#else当上一个条件不成立时,编译下面的代码。
#elif当上一个条件不成立时,根据新条件编译下面的代码。
#endif结束一个条件编译模块。

1. 使用 #ifdef#endif 编译不同平台的代码

#ifdef _WIN32
  // Windows 平台下的代码
  #include <windows.h>
#else
  // 非 Windows 平台下的代码
  #include <unistd.h>
#endif

2. 使用 #if#else 编译不同版本的代码

#define VERSION 3

#if VERSION == 1
  // 版本 1 的代码
#elif VERSION == 2
  // 版本 2 的代码
#elif VERSION == 3
  // 版本 3 的代码
#else
  // 其他版本的代码
#endif

3. 使用 #ifndef#define#endif防止头文件重复包含

#ifndef _MY_HEADER_H_
#define _MY_HEADER_H_

/* 这里是头文件的内容 */

#endif /* _MY_HEADER_H_ */

三、头文件包含 #include <>

头文件包含了一些函数和变量的声明,方便进行程序编写。比如常用的stdio.h、stdlib.h、string.h等头文件就包含了常见的输入输出、内存操作等函数的声明。预处理器的指令#include可以用于包含头文件,例如:

1. 头文件两种写法

用尖括号<>括起来
表示该头文件是标准库文件或系统文件,编译器会在标准库和系统包含路径中查找该头文件。

#include <iostream>

用双引号""括起来
表示该头文件是用户自定义的文件,编译器会在当前编译文件所在目录下查找该头文件。

#include "myHeader.h"

2.C语言头文件

头文件描述
#include<stdio.h>包含输入输出常用函数,如printf、scanf、fprintf、fscanf等。
#include<stdlib.h>包含常用的标准库函数,如malloc、free、exit、atoi等。
#include<string.h>包含字符串处理函数,如strcpy、strcat、strlen等。
#include<math.h>包含常用的数学函数,如sin、cos、sqrt、ceil等。
#include<time.h>包含日期和时间函数,如time、ctime、gmtime等。
#include<ctype.h>包含字符处理函数,如isalnum、isalpha、isdigit等。
#include<stdbool.h>包含布尔变量类型。
#include<limits.h>包含整型变量的范围限制。
#include<float.h>包含浮点型变量的范围限制。

3.C++常用头文件

头文件描述
#include<iostream>C++标准输入输出流,包含了输入输出相关的函数和对象,如cin、cout、cerr、clog等。
#include<string>包含字符串处理函数,如substr、size、length等。
#include<cstdlib>包含C++标准库的通用函数,如stdlib库中的malloc和free函数、字符串处理函数等。
#include<cctype>包含字符处理函数,如isalpha、isdigit等。
#include<cmath>包含数学函数,如sin、cos、sqrt、ceil等。
#include<vector>定义了vector类,支持动态数组操作。
#include<algorithm>包含STL(标准模板库)算法函数,如sort、max_element、min_element等。
#include<map>定义了map类,支持快速查找、插入、删除等操作。
#include<set>定义了set类,支持快速查找、插入、删除等操作。
#include<fstream>C++文件输入输出流,支持文本和二进制文件的读写操作。

在这里插入图片描述

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

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

相关文章

机器学习 00 交叉验证

一、什么是交叉验证(cross validation) 交叉验证:将拿到的训练数掘&#xff0c;分为训练和验证集。以下图为例: 将数据分成4份&#xff0c;其中一份作为验证集。然后经过4次(组)的测试&#xff0c;每次都更换不同的验证集。即得到4组模型的结果&#xff0c;取平均值作为最终结…

ENVI 5.6软件安装教程

软件下载 [软件名称]&#xff1a;ENVI 5.6 [软件大小]&#xff1a;3.25G [安装环境]&#xff1a;Win7~Win11或更高 软件介绍 ENVI 5.6是一款实现遥感图像处理的工具&#xff0c;已经广泛应用于科研、环境保护、气象、石油矿产勘探、农业、林业、医学、地球科学、公用设施管…

RK3568平台使用PyQt5遇到的_ZTI18QOpenGLTimeMonitor, version Qt_5问题解决

1、背景 由于开发需要在ubuntu 20.04 RK3568平台上面使用PyQt5来运行GUI软件&#xff0c;整个软件的环境如下&#xff1a;python3.8 PyQt5 5.14.1版本 fireflyfirefly:/usr/bin$ pip list Package Version ---------------------- -------------------- blink…

4.基于多目标粒子群算法冷热电联供综合能源系统运行优化

4.基于多目标粒子群算法冷热电联供综合能源系统运行优化《文章复现》 相关资源代码&#xff1a;基于多目标粒子群算法冷热电联供综合能源系统运行优化 基于多目标算法的冷热电联供型综合能源系统运行优化 考虑用户舒适度的冷热电多能互补综合能源系统优化调度 仿真平台:matl…

微信小程序【TypeError:Cannot read property ‘xxx‘ of undefined】特殊情况解决方法

xxx是一个属性 报错&#xff1a; 解决方法 翻译&#xff1a;TypeError&#xff1a;无法读取未定义的属性“ xxx” 产生原因&#xff1a; 未定义对应的属性变量不能正确的找到对应的变量 解决方法&#xff1a; 原因一&#xff1a; 在data中定义对应变量&#xff0c;并且最…

【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)

学习目标&#xff1a; 51定时/计数器的详解。 码字不易&#xff0c;如有帮助请收藏&#xff0c;点赞哦。 学习内容&#xff08;背景知识&#xff0c;了解一下对以后学习有帮助&#xff09;&#xff1a; 前提&#xff1a;首先我们知道51单片机内部有21~26个特殊功能寄存器&#…

Linux: 性能分析之On-CPU和Off-CPU

文章目录1. 前言2. 概述3. 分析方法概述3.1 CPU 采样 方法3.2 跟踪 方法4. 使用火焰图分析4.1 On-CPU 分析4.2 Off-CPU 分析4.2.1 Off-CPU 两种分析方法对比4.2.2 生成 Off-CPU 火焰图5. 参考资料1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读…

准备2023(2024)蓝桥杯

前缀和 一维前缀和 s[i]s[i-1]a[i]二维前缀和&#xff08;子矩阵的和&#xff09; s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j] 差分 一维数组 //b是差分数组b[i]c;b[j1]-c;例题 #include<iostream> using namespace std; int n,m; int b[100002],a[100002]; vo…

【系统集成项目管理工程师】信息系统集成及服务

&#x1f4a5;信息系统集成及服务 1、信息技术基础架构库&#xff08;ITIL&#xff09; 简介&#xff1a; 最初是为了提高英国政府部门 IT 服务质量而开发&#xff0c;但它很快在英国的各个企业中得到了广泛的应用和认可。 ITIL 包含着如何管理IT 基础设施的流程描述&#xf…

【OpenCV-Python】cvui 之 trackbar

CVUI 之 trackbar cvui::trackbar() 渲染一个 trackbar&#xff0c; 可以左右拖动或点击对数字进行增加或减少的调整。 不使用离散间隔 使用离散间隔 Python import numpy as np import cv2 import cvuidef trackbar_test():WINDOW_NAME Trackbar-Test# 创建画布frame np.z…

2023-数据质量管理方法总结

一、数据质量保障原则 如何评估数据质量的好坏&#xff0c;业界有不同的标准&#xff0c;阿里主要从4个方面进行评估&#xff1a;完整性、准确性、一致性、及时性&#xff1b; 1.完整性 数据完整性是数据最基础的保障&#xff1b; 完整性&#xff1a;指数据的记录和信息是否…

Redis高级功能

目录 1.RDB 持久化 1.1生成RDB文件的命令 1.2RDB 文件结构 1.3RDB 文件结构 - database 部分 2.AOF 持久化 2.主从复制 2.1重同步 - 完整重同步 2.2重同步 - 部分重同步 2.2.1重同步 - 部分重同步的实现 - PSYNC的实现原理 3.复制的具体过程 3.Sentinel 哨兵模式 …

MySQL Workbench使用入门

软件介绍 MySQL Workbench 是可视化数据库设计软件&#xff0c;为数据库管理员和开发人员提供了一整套可视化的数据库操作环境&#xff0c;主要功能有数据库设计与模型建立、SQL 开发&#xff08;取代 MySQL Query Browser&#xff09;、数据库管理&#xff08;取代 MySQL Adm…

【Vue框架】Vue2中element-ui/mint-ui组件库——element-ui引入组件以及使用案例、mint-ui引入组件及使用案例

文章目录一、element-ui/mint-ui组件库1.1 element-ui使用步骤1.1.1 引入组件1.1.2 修改 .babelrc文件1.2 mint-ui的使用1.2.1 安装引入组件1.2.2 Mint-ui相关组件一、element-ui/mint-ui组件库 element-ui 提供了大量的组件&#xff0c;如&#xff1a;布局组件、表单组件、JS…

运行时内存数据区之虚拟机栈——动态链接、方法返回地址与一些附加信息

动态链接&#xff08;Dynamic Linking&#xff09;——指向运行时常量池的方法引用 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)。比如&#xff1a;invokedynamic指令。…

算法 DAY24 回溯 || 第77题. 组合 216.组合总和III 17.电话号码的字母组合 39. 组合总和

前置知识 回溯算法模板框架如下&#xff1a;void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&am…

rk3568点亮LCD(lvds)

rk3568 Android11/12 适配 lvds 屏 LVDS&#xff08;Low Voltage Differential Signal&#xff09;即低电压差分信号。1994年由美国国家半导体&#xff08;NS&#xff09;公司为克服以TTL电平方式传输宽带高码率数据时功耗大、电磁干扰大等缺点而研制的一种数字视频信号传输方…

堆的实现

思维导图 堆的概念 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事…

【LeetCode】剑指 Offer 50. 第一个只出现一次的字符 p243 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/ 1. 题目介绍&#xff08;50. 第一个只出现一次的字符&#xff09; 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。 【测…

al文章生成-文章生成工具

ai文章生成器 AI文章生成器是一种利用人工智能和自然语言处理技术生成文章的工具。它使用先进的算法、机器学习和深度学习技术&#xff0c;深度挖掘和提取大量数据背后的信息&#xff0c;自主学习并合并新的信息&#xff0c;生成优质、原创的文章。 使用AI文章生成器的优点如下…