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 最后一个窗口一直没有新数据,窗口不关闭问题 自定义实现 WatermarkStrategy接口 自定义实现 WatermarkStrategy接口 窗口类型:滚动窗口 代码: public static class WatermarkDemoFunction implements WatermarkStrategy<JSONObject…...
mybatis----小细节
1、起别名 在MyBatis中,<typeAliases>元素用于定义类型别名,它可以将Java类名映射为一个更简短的别名,这样在映射文件中可以直接使用别名而不需要完整的类名。 下面是一个示例: 在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代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 相关资料:卡诺图化简法-CSDN博客 题目链接:Kmap1 - HDLBits module top_module(input a,input b,input c,output out );assig…...
由于找不到d3dcompiler_43.dll缺失,无法打开软件的解决方法分享
d3dcompiler43.dll是什么文件?为什么会出现丢失的情况?又该如何解决呢?本文将详细介绍d3dcompiler43.dll的作用和影响,并提供6个有效的解决方法。 一、d3dcompiler43.dll是什么文件? d3dcompiler43.dll是DirectX SDK…...
现阶段Python和Java哪个更吃香?
现阶段Python和Java哪个更吃香? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&…...
基于DNA的密码学和隐写术综述
摘要 本文全面调研了不同的脱氧核糖核酸(DNA)-基于密码学和隐写术技术。基于DNA的密码学是一个新兴领域,利用DNA分子的大规模并行性和巨大的存储容量来编码和解码信息。近年来,由于其相对传统密码学方法的潜在优势,如高存储容量、低错误率和对环境因素的抗性,该领域引起…...
【linux 多线程并发】多线程的控制,挂起线程暂停运行,直到唤醒线程,取消线程运行,可以设置合适的取消点属性避免不安全点被中止
线程运行控制 专栏内容: 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况…...
java转义字符
//转义字符的使用 public class ChangeChar{//编写一个main方法public static void main(String[] args){// \t :一个制表位,实现对齐的功能System.out.println("北京\t天津\t上海");// \n :换行符,实现换行System.out.println("jack\nsm…...
UDP服务器和客户端的创建步骤
UDP服务器的创建步骤: 一、创建用户数据报套接字(socket函数):通信域选择IPV4网络协议、套接字类型选择数据报式; int sockfd socket(AF_INET,SOCK_DGRAM,0); 二、填充服务器的网络信息结构体:1.定义网络…...
【问题记录】使用命令语句从kaggle中下载数据集
从Kaggle中下载Tusimple数据集 1.服务器环境中安装kaggle 使用命令:pip install kaggle 2.复制下载API 具体命令如下: kaggle datasets download -d manideep1108/tusimple3.配置kaggle.json文件 如果直接使用命令会报错: root:~# kagg…...
Centos 更换内核
文章目录 一、查看/更换系统内核1.1 查看当前运行环境的内核1.2 查看系统上所有可用内核1.3 切换内核方法一:通过启动菜单更换内核方法二:更换默认启动内核 二、安装内核2.1 使用ELRepo安装2.2 安装指定内核版本参考资料 一、查看/更换系统内核 1.1 查看…...
RestTemplate调用Http方法
场景:前端调用后端的接口完成设备参数的更新,后端在接口代码中需要调用设备端提供的接口来完成设备参数的更新。 RestTemplate 是用于同步client端访问 Restful 服务的一个核心类 默认使用 JDK 提供的包去建立HTTP连接 为每种 HTTP 请求都实现了相关的…...
软考笔记--操作系统-内存管理
任何程序和数据都必须占用内存空间后才能执行,因此,内存管理的好坏直接影响整个操作系统的性能。操作系统的任务之一是尽可能地方便用户使用和提高内存的利用率。同时,内存管理也是多道程序设计系统的关键支撑。内存管理的功能主要包括以下几…...
Spring Boot整合日期转换器(Converter)和拦截器(HandlerInterceptor)
添加日期转换器(Converter) 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
目录 准备工作代码运行 说明:本文通过 FastAPI 实现返回两个参数 ab 的值; 准备工作 默认读者已准备完善 Python IDE工具以及包管理工具。 首先,需要安装 fastapi 和 uvicorn 库,如果没有请使用 pip 进行安装: pip…...
C#设计模式教程(4):单例模式
单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个访问它的全局访问点。在C#中实现单例模式通常有几种不同的方法,这里介绍几种典型的实现方式。 C# 单例模式的各种实现方式 1. 懒汉式(线程不安全) public class Singleton {p…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
