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

C++中的预处理

一.预定义符号

1.__FILE__进行编译的源文件

2.__LINE__文件当前的行号

3.__DATE__文件被编译的日期

4.__TIME文件被编译的时间

5.__STDC__如果编译器遵循ANSIC,其值为1,否则未定义

二.#define

基本语法:#define 名字 内容   eg.define M 1

经#define定义的常量时不经过任何计算,直接打印  eg #define M 1+1则M = 1 + 1(不是2)

注意:在用#define定义时后面不要加   ;   否则可能导致错误

#define机制规定允许把参数替换到文本中,这种实现通常称为"宏"或者"定义宏"   

eg.#define (x) (x)*(x)

宏的参数中如果有操作符,因为运算符有优先级的问题,可能导致运算顺序错误,因此在宏的书写时,最好给参数带上括号

三.带有副作用的宏

当宏参数在宏定义中出现超过一次时,如果参数带有副作用,使用宏时就可能存在危险  

eg.

#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main()
{int a,b;a = 3;b = 5;int m = MAX(a++,b++);}

此时由于a++,b++具有副作用(修改了a和b本身的值),会导致输出结果m = 6,此时a = 4,b = 7

四.宏的替换规则

1.在调用宏时,首先检查参数中是否有#define定义的符号,如果有就首先替换它

2.替换文本随后被插入到程序中原本的文本的位置,即参数名被值替换

3.再次对结果文件扫描,看是否包含由#define定义的符号,如果有,重复操作

注意:1.宏参数和#define定义中可以出现其他#define的符号,但是宏不能递归

         2.当预处理器搜索#define定义的符号时,字符串常量 的内容不会被搜索

五.宏和函数的对比

宏通常用于较简单的运算

宏的程序规模和速度较好,效率更高,同时,宏对参数类型没有要求

宏的劣势:

1.每次宏的使用,一份宏的代码就会被插入到程序中,除非宏比较短,否则会大大增加程序的长度

2.宏无法调试

3.由于宏对类型不做要求,所以不够严谨

4.宏可能存在运算符优先级的问题,容易导致程序出错

宏和函数的语法相似,为了方便区分宏和函数,通常将宏的名字全部大写,函数的名字不全部大写

六.#和##

#运算符将宏的一个参数转换为字符串字面量,可以理解成字符串化,时参数不转换成对应的值

##运算符可以把它两边的符号合成一个符号,这样的连接必须产生一个合法的标识符,否则结果未定义

eg.使用宏定义求最大值的函数

#define GET_MAX(type)\
type type##_max(type x,type y)\
{\return (x > y ? x : y);\
}

在这段宏定义中,##会将type和_max拼接在一起得到函数名

后面就可以正常调用函数了

eg.

int m = int_max(1,2);
double n = double_max(1.5,2.3);

七.#undef

这条指令用于移除一个宏定义

八. 条件编译

在编译程序时可以使用条件编译指令经语句编译或放弃

条件编译指令:

1.

#if 常量表达式

...

#elif

...

#else

...

#endif

它的使用类似与 if 的用法

注意:条件编译指令在预处理阶段完成,所以不能用变量表示(预处理阶段变量未生成)

2.判断是否被定义

#ifdef  (或者#ifndef,表示如果没定义)

...

#endif

也可以用#if define ... (#if !define)代替

九.头文件包含

1.本地文件的包含

使用#include "..."

查找策略:先在源文件所在目录查找,如果找不到,编译器在像查找库函数头文件一样在标准位置查找头文件

2.库文件的包含

使用#include <...>

查找策略:直接在标准库中查找

3.嵌套文件包含

当工程较大时,可能存在头文件的多次包含,而头文件的多次包含会导致代码量大增,为了防止头文件的重复包含,可以使用#pragma once

相关文章:

C++中的预处理

一.预定义符号 1.__FILE__进行编译的源文件 2.__LINE__文件当前的行号 3.__DATE__文件被编译的日期 4.__TIME文件被编译的时间 5.__STDC__如果编译器遵循ANSIC,其值为1,否则未定义 二.#define 基本语法:#define 名字 内容 eg.define M 1 经#define定义的常量时不经过…...

flink 最后一个窗口一直没有新数据,窗口不关闭问题

flink 最后一个窗口一直没有新数据&#xff0c;窗口不关闭问题 自定义实现 WatermarkStrategy接口 自定义实现 WatermarkStrategy接口 窗口类型&#xff1a;滚动窗口 代码&#xff1a; public static class WatermarkDemoFunction implements WatermarkStrategy<JSONObject…...

mybatis----小细节

1、起别名 在MyBatis中&#xff0c;<typeAliases>元素用于定义类型别名&#xff0c;它可以将Java类名映射为一个更简短的别名&#xff0c;这样在映射文件中可以直接使用别名而不需要完整的类名。 下面是一个示例&#xff1a; 在mybatis核心配置文件中配置typeAliases标…...

解密Oracle数据库引擎:揭开数据存储的神秘面纱

目录 1、介绍Oracle数据库引擎 1.1 什么是Oracle数据库引擎 1.2 Oracle数据库引擎的作用和功能 1.3 Oracle数据库引擎的历史和发展 2、Oracle数据库引擎的体系结构 2.1 Oracle数据库实例的组成部分 2.2 Oracle数据库引擎的层次结构 2.3 Oracle数据库引擎的关键组件 3、…...

「HDLBits题解」Karnaugh Map to Circuit

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 相关资料&#xff1a;卡诺图化简法-CSDN博客 题目链接&#xff1a;Kmap1 - HDLBits module top_module(input a,input b,input c,output out );assig…...

由于找不到d3dcompiler_43.dll缺失,无法打开软件的解决方法分享

d3dcompiler43.dll是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍d3dcompiler43.dll的作用和影响&#xff0c;并提供6个有效的解决方法。 一、d3dcompiler43.dll是什么文件&#xff1f; d3dcompiler43.dll是DirectX SDK…...

现阶段Python和Java哪个更吃香?

现阶段Python和Java哪个更吃香&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…...

基于DNA的密码学和隐写术综述

摘要 本文全面调研了不同的脱氧核糖核酸(DNA)-基于密码学和隐写术技术。基于DNA的密码学是一个新兴领域,利用DNA分子的大规模并行性和巨大的存储容量来编码和解码信息。近年来,由于其相对传统密码学方法的潜在优势,如高存储容量、低错误率和对环境因素的抗性,该领域引起…...

【linux 多线程并发】多线程的控制,挂起线程暂停运行,直到唤醒线程,取消线程运行,可以设置合适的取消点属性避免不安全点被中止

线程运行控制 ​专栏内容&#xff1a; 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构&#xff0c;以及如何实现多机的数据库节点的多读多写&#xff0c;与传统主备&#xff0c;MPP的区别&#xff0c;技术难点的分析&#xff0c;数据元数据同步&#xff0c;多主节点的情况…...

java转义字符

//转义字符的使用 public class ChangeChar{//编写一个main方法public static void main(String[] args){// \t :一个制表位&#xff0c;实现对齐的功能System.out.println("北京\t天津\t上海");// \n :换行符&#xff0c;实现换行System.out.println("jack\nsm…...

UDP服务器和客户端的创建步骤

UDP服务器的创建步骤&#xff1a; 一、创建用户数据报套接字&#xff08;socket函数&#xff09;&#xff1a;通信域选择IPV4网络协议、套接字类型选择数据报式&#xff1b; int sockfd socket(AF_INET,SOCK_DGRAM,0); 二、填充服务器的网络信息结构体&#xff1a;1.定义网络…...

【问题记录】使用命令语句从kaggle中下载数据集

从Kaggle中下载Tusimple数据集 1.服务器环境中安装kaggle 使用命令&#xff1a;pip install kaggle 2.复制下载API 具体命令如下&#xff1a; kaggle datasets download -d manideep1108/tusimple3.配置kaggle.json文件 如果直接使用命令会报错&#xff1a; root:~# kagg…...

Centos 更换内核

文章目录 一、查看/更换系统内核1.1 查看当前运行环境的内核1.2 查看系统上所有可用内核1.3 切换内核方法一&#xff1a;通过启动菜单更换内核方法二&#xff1a;更换默认启动内核 二、安装内核2.1 使用ELRepo安装2.2 安装指定内核版本参考资料 一、查看/更换系统内核 1.1 查看…...

RestTemplate调用Http方法

场景&#xff1a;前端调用后端的接口完成设备参数的更新&#xff0c;后端在接口代码中需要调用设备端提供的接口来完成设备参数的更新。 RestTemplate 是用于同步client端访问 Restful 服务的一个核心类 默认使用 JDK 提供的包去建立HTTP连接 为每种 HTTP 请求都实现了相关的…...

软考笔记--操作系统-内存管理

任何程序和数据都必须占用内存空间后才能执行&#xff0c;因此&#xff0c;内存管理的好坏直接影响整个操作系统的性能。操作系统的任务之一是尽可能地方便用户使用和提高内存的利用率。同时&#xff0c;内存管理也是多道程序设计系统的关键支撑。内存管理的功能主要包括以下几…...

Spring Boot整合日期转换器(Converter)和拦截器(HandlerInterceptor)

添加日期转换器&#xff08;Converter&#xff09; public class DataConverter implements Converter<String, Date> {Overridepublic Date convert(String s) {try {SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-MM-dd");return simpleD…...

100天精通Python(实用脚本篇)——第112天:图像处理批量给图片添加水印,防盗必备建议收藏!!!(附上脚本代码)

文章目录 专栏导读1. 图片设置水印的意义?2. 需求3. 实现效果4. 添加全屏水印4.1 单张图片添加全屏水印4.2 批量给多张图片添加全屏水印5. 添加指定位置水印5.1 模块介绍5.2 批量添加脚本实现专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零…...

SpringMVC(全局异常处理.动态接收Ajax请求)

1.全局异常处理 1 异常处理器 基于AOP 用户发起请求, SpringMVC接受请求, SpringMVC加载静态资源问题说明 请求过去了,但没有处理 规则说明:静态资源进入SpringMVC框架之后,没有找到要怎样处理静态资源的方法,所以他们就不解决,也就不显示 解决方法:SpringMVC基于Servlet处理…...

【FastAPI】P1 简单实现 a+b

目录 准备工作代码运行 说明&#xff1a;本文通过 FastAPI 实现返回两个参数 ab 的值&#xff1b; 准备工作 默认读者已准备完善 Python IDE工具以及包管理工具。 首先&#xff0c;需要安装 fastapi 和 uvicorn 库&#xff0c;如果没有请使用 pip 进行安装&#xff1a; pip…...

C#设计模式教程(4):单例模式

单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个访问它的全局访问点。在C#中实现单例模式通常有几种不同的方法,这里介绍几种典型的实现方式。 C# 单例模式的各种实现方式 1. 懒汉式(线程不安全) public class Singleton {p…...

常用的git diff命令用法汇总和示例

文章目录 1. 查看工作目录和暂存区的差异2. 查看暂存区和最后一次提交的差异3. 查看两个提交之间的差异4. 查看特定文件的更改5. 查看特定文件在两个提交之间的差异6. 查看分支之间的差异7. 查看某次提交的更改8. 限制diff输出的格式9. 查看一定时间范围内的更改 Git的diff命令…...

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

一键式Excel分词统计工具&#xff1a;如何轻松打包Python脚本为EXE 写在最前面需求分析直接用Python打包为什么大&#xff1f;为什么要使用conda环境&#xff1f; 将Python脚本打包为一个独立的应用程序1. 编写Python脚本&#xff1a;初步功能实现2. 初步图形用户界面&#xff…...

Windows系统字体尺寸学习

调用GetTextMetrics来获得字体尺寸信息, 函数返回设备描述表中当前选定的字体信息&#xff1b; 返回值到TEXTMETRIC类型的结构中&#xff1b; 返回字段值的单位取决于当前设备描述表映射方式&#xff1b;默认映射方式是MM_TEXT&#xff0c;值的单位是像素&#xff1b; 前7个字…...

SSH隧道技术

SSH隧道 简介 SSH隧道是一种通过SSH协议在两个网络节点之间建立安全通信的技术。它可以用于多种用途&#xff0c;包括加密和保护敏感数据传输、绕过防火墙限制、远程访问内部服务等。 应用&#xff1a; 端口转发&#xff1a;SSH隧道可以将本地端口转发到远程主机上&#xf…...

支付功能的实现

1.商户调用第三方支付服务的主要步骤流程&#xff1f; 1.1 表单跳转 前端点击提交支付&#xff0c;请求后端支付接口 支付接口通过阿里api生成表单信息返回给前端页面 同步回调&#xff0c;异步回调参数 请求参数&#xff1a;总金额&#xff0c;外部订单号 公共参数&#xff1…...

SpringMVC JSON数据处理见解6

6.JSON数据处理 6.1.添加json依赖 springmvc 默认使用jackson作为json类库,不需要修改applicationContext-servlet.xml任何配置&#xff0c;只需引入以下类库springmvc就可以处理json数据&#xff1a; <!--spring-json依赖--> <dependency><groupId>com.f…...

python 读写kafka

1. 安装pykafka pip install pykafka2. 生产者 from pykafka import KafkaClientdef get_kafka_producer(hosts, topics):client KafkaClient(hostshosts)print(client.topics)topic client.topics[topics]producer topic.get_producer()return producer 测试 hosts 19…...

VBA: 如何用VBA遍历文件夹(含子文件夹)里的所有文件

目录 0 原始文件 1 step1:遍历文件夹&#xff08;不包含子文件&#xff09;内的文件数 2 step2: 遍历文件夹内的所有子文件夹的名字 3 step3 遍历文件夹的&#xff08;含子文件&#xff09;内的所有文件 4 step4 遍历文件夹的&#xff08;含子文件&#xff09;内的所有文…...

又快又好! 基于Consistency Model的一步采样歌声转换模型CoMoSVC已开源

在2023年&#xff0c;AI虚拟歌手如AI孙燕姿等已经引起了广泛的关注&#xff0c;而大多数应用都是基于开源框架SoVITS。最近&#xff0c;香港科技大学和微软亚洲研究院推出了一种基于Consistency Model的歌声转换系统CoMoSVC&#xff0c;它在歌声转换速度上与基于Flow的SoVITS系…...

服务器——配置免密登录

一、生成本机的密钥文件 打开本机的终端&#xff0c;输入 ssh-keygen&#xff0c;默认一路点enter。 将生成的 id_rsa.pub 公钥文件&#xff0c;复制一份改一个名称&#xff0c;比如改名成 id_rsa_test.pub。 二、将生成的公钥文件发送到服务器对应账户的.ssh文件夹下 将改…...