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…...
【架构实战】日志体系ELK:集中化日志管理实践
【架构实战】日志体系ELK:集中化日志管理实践字数统计:约3500字一、从一个深夜告警说起 2024年双十一前的凌晨两点,我接到运维的电话:“支付服务挂了,用户投诉量飙升。” 我揉着眼睛打开电脑,第一件事就是登…...
Unity 2019格斗游戏开发:帧同步、输入缓冲与Hitbox/Hurtbox实现
1. 为什么2019版Unity仍是横板格斗开发的“黄金锚点”我带过三届游戏开发训练营,每次开课前都会问学员:“你最想用哪个版本做格斗游戏?”——超过七成的人脱口而出“最新版”。但当我把他们拉进一个用Unity 2019.4.40f1跑通的《街霸》风格连招…...
别再手动敲命令了!用Kuboard-Spray v1.2.4图形化搞定K8s集群(附CentOS 7.9避坑实录)
图形化利器Kuboard-Spray v1.2.4:三分钟搭建生产级K8s集群的避坑指南 当你在凌晨三点盯着满屏的kubeadm init报错信息时,是否想过Kubernetes集群部署还能更简单?去年我们团队在客户现场部署一套生产环境时,传统命令行方式让我们在…...
在树莓派等arm设备上观测大模型API调用的延迟与稳定性表现
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在树莓派等ARM设备上观测大模型API调用的延迟与稳定性表现 在边缘计算或资源受限的环境中,例如使用树莓派等基于ARM架构…...
从过采样到Σ-Δ调制:采样技术如何成为提升信噪比的秘密武器
1. 项目概述:从“听不清”到“听得清”的底层博弈 在信号处理、音频工程、通信系统乃至生物医学检测的日常工作中,我们总会遇到一个共同的“敌人”——噪声。无论你是在调试一段录音,分析一组传感器数据,还是试图从遥远的深空接收…...
HSTracker:为macOS炉石传说玩家打造的数据智能助手
HSTracker:为macOS炉石传说玩家打造的数据智能助手 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker 在瞬息万变的炉石传说对局中,你是否曾因忘记对…...
Fastboot Enhance:Windows平台Android设备管理的终极图形化解决方案
Fastboot Enhance:Windows平台Android设备管理的终极图形化解决方案 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance Fastboot Enhance…...
【实操经验】拒答能力不达标,大模型备案怎么过
在生成式 AI 监管趋严的 2026 年,拒答率≥95% 是大模型备案的硬性门槛(GB/T 45644-2025)。不少自研或二次开发模型因安全对齐不足、拒答逻辑薄弱,测试时频繁 “翻车”—— 敏感问题答非所问、违法指令直接执行、多轮诱导轻易妥协&…...
Seraphine:如何通过智能战绩查询和BP辅助提升英雄联盟竞技体验
Seraphine:如何通过智能战绩查询和BP辅助提升英雄联盟竞技体验 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 想象一下这样的场景:你刚刚进入英雄联盟的排位赛BP阶段,屏幕…...
2026年AI辅助研发趋势:智能知识问答如何重塑企业知识库的未来?
在2026年的当下,大模型技术已经从最初的"聊天玩具"逐渐渗透到企业级研发的毛细血管中。作为深耕DevOps领域的架构师,我观察到一个显著的变化:企业知识库(Knowledge Base)正在从单纯的"文档存储中心&quo…...
