当前位置: 首页 > news >正文

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

在这里插入图片描述

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

目录

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


一、宏替换 #define

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

注意事项:

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

1. 定义常量

这个宏定义了一个名为 PI 的常量,并将其值设定为 3.1415926。
例子中PI会被替换成3.14159

#define PI 3.1415926

2. 定义函数

这个宏定义了一个名为 MAX 的函数,并使用三目运算符定义了其功能,即返回两个参数中的较大值。
例子中,MAX(a,b)会被替换成((a)>(b)?(a):(b))。

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

3. 定义代码块

在预处理过程中,宏会被直接替换成相应的值

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

二、条件编译 #if

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

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

1. 使用 #ifdef#else#endif

编译不同平台的代码

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

定义导出dllexport

#if defined(_WIN32)
#define DllExport __declspec(dllexport)
#else
#define DllExport
#endif

定义导出dllimport

#if defined(_WIN32) && !defined(WNT_STATIC_LINK)
#    define UFUNEXPORT       __declspec(dllimport)
#    define UFUNGLOBAL       extern __declspec(dllimport)
#else
#    define UFUNEXPORT
#    define UFUNGLOBAL       extern
#endif
#ifndef LIBNXOPENUICPP_EXPORTS_HXX_INCLUDED
#define LIBNXOPENUICPP_EXPORTS_HXX_INCLUDED
#	   if defined(_WIN32) && !defined(WNT_STATIC_LINK)
#		   define NXOPENUICPPEXPORT	   __declspec(dllimport)
#		   define NXOPENUICPPGLOBAL	   extern __declspec(dllimport)
#		   define NXOPENUICPPTEMPLATE	 extern
#	   else
#		   define NXOPENUICPPEXPORT
#		   define NXOPENUICPPGLOBAL	   extern
#		   define NXOPENUICPPTEMPLATE
#	   endif
#endif  /*  LIBNXOPENUICPP_EXPORTS_HXX_INCLUDED  */

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

#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可以用于包含头文件,例如:#include<stdio.h>、#include"myHead.h"

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++文件输入输出流,支持文本和二进制文件的读写操作。

在这里插入图片描述

相关文章:

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

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录 一、宏替换 #define1. 定义常量2. 定义函数3. 定义代码块 二、条件编译 #if1. 使用 #ifdef、 #else 和 #endif2. 使用 #if 、#elif、#else和 #endif 编译不同版本的代码3. 使用 #ifndef 和 #def…...

java语言入门教程文章

好的&#xff0c;以下是Java语言入门教程&#xff1a; Java是一种高级编程语言&#xff0c;由Sun Microsystems于1995年推出。Java语言具有良好的可移植性和安全性&#xff0c;因此被广泛应用于Web应用程序、移动应用程序、企业应用程序等各个领域。本教程将带领初学者快速入门…...

基于灰狼算法的极限学习机(ELM)回归预测-附代码

基于灰狼算法的极限学习机(ELM)回归预测 文章目录 基于灰狼算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于灰狼算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;本文利用灰狼算法对极限学习机进行优化&#xff0c;并…...

【五一创作】ERP实施-委外业务-委外采购业务

委外业务主要有两种业务形态&#xff1a;委外采购和工序外协&#xff0c;委外采购主要是在MM模块中实现&#xff0c;工序外协主要由PP模块实现&#xff0c;工序外协中的采购订单创建和采购收货由MM模块实现。 委外采购概念 委外采购&#xff0c;有些企业也称为带料委外或者分包…...

DAY 54 数据库基础

数据库的基本概念 数据&#xff08;Data&#xff09;&#xff1a; 描述事务的符号记录包括数字、文字、图形、图像、声音、档案记录以”记录“形式按统一的格式进行存储 表&#xff1a; 将不同的记录组织在一起用来存储具体数据 数据库&#xff1a; 表的集合&#xff0c;…...

网络编程 总结二

一、TCP TCP模型 1. TCP搭建相关函数&#xff1a; 套接字Socket 1&#xff09;Socket函数&#xff1a; 2&#xff09;bind 3&#xff09;listen 4&#xff09;accept 5&#xff09;recv 注意&#xff1a; 1> TCP中的recv 可以替换成read&#xff1b; 2>TCP中的…...

消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务

根据国外科技媒体 iMore 报道&#xff0c;基于消息源 analyst941 透露的信息&#xff0c;苹果公司目前并未开发 MFi 限制。 根据推文信息内容&#xff0c;两款 iPhone 15 机型的最高充电功率为 20W&#xff0c;而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…...

设计模式——工厂模式(简单工厂、工厂方法、抽象工厂)

是什么&#xff1f; 工厂模式的目的是将创建对象的具体过程隐藏起来&#xff0c;从而达到更高的灵活性 工厂模式分为&#xff1a;简单工厂模式、工厂方法模式、抽象工厂模式&#xff1b; 为什么&#xff1f; 在Java中&#xff0c;万物皆是对象&#xff0c;我们在使用的时候…...

《C语言技术体系》 学习路线总目录 + 思维导图

目录 前言 正文 思维导图 第1章 流程结构 1.1 初识C语言 1.2 流程结构 1.3 数据类型 1.4 运算符表达式 第2章 指针与数组 2.1 指针基本概念 2.2 一维数组 2.3 二维及多维数组 2.4 指针与数组 第3章 模块化重构 3.1 函数 3.2 typedef类型定义 3.3 enum枚举 3.…...

数字图像处理简答题

目录 1.人类视觉对颜色的主观感觉包括哪三类&#xff1f; 2. 图像成像的过程包括哪三步&#xff1f; 3.图像的采样和量化分别指什么&#xff1f; 4、取k8时&#xff0c;将下图用相应矩阵表示 5、简述当限定了数字图像的数据量时采样和量化参数的选择遵循哪两条原则&#x…...

【Java校招面试】基础知识(五)——GC

目录 前言一、基础概念二、垃圾回收算法三、垃圾收集器四、引用后记 前言 本篇主要介绍Java垃圾回收机制——GC的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第五篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专…...

使用CMake调用Makefile 项目

目录标题 基本示例Cmake传递lib给MakefileCmake传递参数给Makefile&#xff0c;比如make cleanWindows下使用Cmake调用Makefile 基本示例 如果项目是使用传统的Makefile构建的&#xff0c;并且您希望使用CMake调用这些Makefile&#xff0c;您可以使用CMake的add_custom_target…...

快速傅里叶变换FFT学习笔记

点值表示法 我们正常表示一个多项式的方式&#xff0c;形如 A ( x ) a 0 a 1 x a 2 x 2 . . . a n x n A(x)a_0a_1xa_2x^2...a_nx^n A(x)a0​a1​xa2​x2...an​xn&#xff0c;这是正常人容易看懂的&#xff0c;但是&#xff0c;我们还有一种表示法。 我们知道&#xf…...

如何下载安装驱动

1 打开浏览器 这里以Edge浏览器举例 第一步打开桌面上的Edge浏览器 如果您的桌面上没有 那么找到搜索栏 搜索Edge 然后打开 打开之后一般是这样 然后把我发送您的地址 驱动下载地址 https://t.lenovo.com.cn/yfeyfYyD &#xff08;这个网址只是一个例子&#xff09; 删除掉前…...

鸿蒙Hi3861学习四-Huawei LiteOS介绍

一、什么是LitesOS Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统&#xff0c;是华为物联网战略的重要组成部分&#xff0c;具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力。基于物联网领域业务特征打造领域性技术栈&#xff0c;为开发者提供“一…...

Vue核心 收集表单数据 过滤器

1.14. 收集表单数据 收集表单数据: 若: &#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值。若: &#xff0c;则v-model收集的是value值&#xff0c;且要给标签配置value值。若: 没有配置input的value属性&#xff0c;那么收集的就是checked(勾选 or 未…...

华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包

华为EC6108V9E&#xff0f;EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的…...

数字化转型导师坚鹏:面向数字化转型的大数据顶层设计实践

面向数字化转型的大数据顶层设计实践 课程背景&#xff1a; 数字化背景下&#xff0c;很多企业存在以下问题&#xff1a; 不清楚大数据思维如何建立&#xff1f; 不清楚企业大数据分析方法&#xff1f; 不了解大数据应用成功案例&#xff1f; 课程特色&#xff1a; …...

day27_mysql

今日内容 零、 复习昨日 一、单表查询 二、多表联查 零、 复习昨日 1 DDL,DML,DQL是啥 DDL 数据定义语言&#xff08;库&#xff0c;表&#xff0c;列&#xff09;DML 数据操作语言&#xff08;表内数据的操作增删改&#xff09;DQL 数据查询语言&#xff08;表内数据的查询&am…...

QwtPlotCurve使用说明

QwtPlotCurve是Qwt库中用于绘制曲线的类&#xff0c;可以在QwtPlot上绘制各种类型的曲线&#xff0c;如折线、样条线、散点等。以下是QwtPlotCurve的一些常用函数和使用说明&#xff1a; setSamples(const QPolygonF &samples)&#xff1a;设置曲线的数据点&#xff0c;参数…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...