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

【C++】 C/C++预处理器介绍

 

C++预处理器(Preprocessor)是编译过程中的一个阶段,它在编译器进行实际编译之前对源代码进行处理。预处理器提供了一系列的指令,用于条件编译、文件包含、宏定义等操作。以下是一些常见的预处理器指令:

宏定义(Macro Definition)

使用 #define 指令来定义宏。宏可以是简单的值替换,也可以是复杂的表达式或语句序列。

#define PI 3.14159
#define SQUARE(x) ((x) * (x))

文件包含(File Inclusion)

使用 #include 指令来包含头文件或其他源文件。<> 中的文件通常表示标准库或第三方库的文件,而 " " 中的文件表示项目内的文件。

#include <iostream> // 标准库头文件
#include "my_header.h" // 项目内的头文件

条件编译(Conditional Compilation)

使用 #if, #ifdef, #ifndef, #else, #elif, #endif 等指令来控制源代码的编译条件。

#define DEBUG
#if defined(DEBUG)std::cout << "Debug mode" << std::endl;
#endif#ifdef _WIN32std::cout << "Compiling for Windows" << std::endl;
#elif defined(__linux__)std::cout << "Compiling for Linux" << std::endl;
#endif

宏展开(Macro Expansion)

预处理器会在编译之前先展开所有宏定义,将宏替换为它们的值或定义的代码。

行控制(Line Control)

使用 #line 指令来控制编译器的行号和文件名显示。

错误指令(Error Directive)

使用 #error 指令来在编译时生成错误信息。

空指令(Null Directive)

使用 #后跟空格或换行符,表示一个空的预处理指令,通常用于分隔代码块。

字符串化操作符(Stringizing Operator)

使用 #操作符可以将宏参数转换为字符串。

#define STRINGIZE(x) #x
STRINGIZE(This will be a string)

连接操作符(Concatenation Operator)

使用 ##操作符可以在宏定义中连接两个参数。

#define CONCAT(x, y) x ## y
CONCAT(My, Class) // 展开为 MyClass

 

预处理器的工作是编译过程的一部分,通常在编译器实际编译代码之前完成。预处理器指令通常以井号(#)开头,并且不包括在最终的编译代码中。预处理器的这些功能使得C++程序能够更加灵活和可配置。

 

相关文章:

【C++】 C/C++预处理器介绍

C预处理器&#xff08;Preprocessor&#xff09;是编译过程中的一个阶段&#xff0c;它在编译器进行实际编译之前对源代码进行处理。预处理器提供了一系列的指令&#xff0c;用于条件编译、文件包含、宏定义等操作。以下是一些常见的预处理器指令&#xff1a; 宏定义&#xff…...

MySQL—创建查看删除备份恢复数据库

创建数据库 创建数据库 LLF_DB01CREATE DATABASE LLF_DB01删除数据库DROP DATABASE LLF_DB01创建一个使用utf8字符集的数据库并带校对规则的数据库CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin 查看、删除数据库 显示所有的数据库SHOW DATABASES显示数据库…...

1.4 ROS2集成开发环境搭建

1.4.1 安装VSCode VSCode全称Visual Studio Code&#xff0c;是微软推出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT 等特性&#xff0c;支持插件…...

数组和对象在内存中的区别

一、内存分配方式 数组在内存中是一段连续的存储空间&#xff0c;每个元素占据一个位置&#xff0c;这种连续存储方式使得数组的访问速度更快。对象在内存中是以键值对的形式存储的&#xff0c;每个键值对都需要单独的内存空间&#xff0c;这种非连续的存储方式可能会导致访问…...

智能胎教仪,科技与教育的融合-N9301胎教仪语音方案

随着科学技术的不断进步&#xff0c;人们对婴幼儿教育的认知也日趋成熟和全面。其中&#xff0c;胎教作为一种重要的早期教育方式&#xff0c;近年来备受瞩目。而胎教仪语音芯片的研发&#xff0c;正是为了满足这一需求&#xff0c;为胎儿的健康成长提供更加便捷的胎教方案。 一…...

代码随想录2链表

2 移除元素 Leetcode203 设置虚拟头节点 dummyHead...

Java8新特性常见用法

Java8新特性 示例类Stream API 使用示例forEach:遍历Stream:创建流map:转换元素filter:过滤元素collect(收集元素) 和 Collectors(分组、连接)sorted 和 comparing(搭配排序)toMap:转换Map元素collectingAndThen:过滤掉相同数据toUpperCase:转大写distinct:去重c…...

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而&#xff0c;这种快速增长也吸引了恶意行为者的注意&#xff0c;他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上&#xff0c;但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…...

C++ 如何解决回调地狱问题

“地狱回调”&#xff08;Callback Hell&#xff09;是指在编程中使用过多嵌套回调函数&#xff0c;导致代码难以阅读和维护。C 提供了多种方法来解决这个问题&#xff0c;包括以下几种常见的方法&#xff1a; 使用 Lambda 表达式和标准库的 std::function使用 std::future 和…...

普利姆最小生成树算法 c++

普里姆(Prim)算法是一种用于在加权连通无向图中查找最小生成树(MST, Minimum Spanning Tree)的贪心算法。最小生成树是一个子图,它包括图中的所有顶点,并且边的总权重最小。该算法的基本思想是从一个顶点开始,逐步扩展生成树,直到包括所有顶点。 算法步骤 初始化: 从…...

Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire

一、前言 线上项目往往依赖非常多的具备特定能力的资源&#xff0c;如&#xff1a;DB、MQ、各种中间件&#xff0c;以及随着项目业务的复杂化&#xff0c;单一项目内&#xff0c;业务模块也逐渐增多&#xff0c;如何高效、整洁管理各种资源十分重要。 本文从“术”层面&#…...

ubuntu 23 连接正点imx6ull的uboot网络设置(nfs和tftp)

由于使用ubuntu23&#xff0c;无法连接正点的imx6ull的uboot&#xff0c;因为这个uboot里面的nfs是v2&#xff0c;ubuntu23内核是6.5不支持uboot v2。配置/etc/default/nfs-kernel-server sudo vim /etc/default/nfs-kernel-server 更改以下参数&#xff1a; RPCNFSDCOUNT"…...

CC6利用链分析

CC1的两条利用链&#xff0c;在JDK 8u71之后已修复&#xff0c;不可利用。 学一下不受版本限制的CC6利用链 分析版本 Commons Collections 3.2.1 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 我的Github主页Java反序列化学习同步更新&#xff0c;有简单…...

多线程编程的基本概念,C++标准库中的多线程支持(std::thread,std::async),如何处理线程同步和并发问题。

多线程编程在现代计算机系统中非常重要&#xff0c;因为它能够使程序同时执行多个操作&#xff0c;提高计算效率。以下是多线程编程的基本概念及如何在C标准库中使用std::thread和std::async进行多线程编程&#xff0c;同时处理线程同步和并发问题。 多线程编程的基本概念 线程…...

Linux的Socket开发概述

套接字&#xff08;socket&#xff09;是 Linux 下的一种进程间通信机制&#xff08;socket IPC&#xff09;&#xff0c;在前面的内容中已经给大家提到过&#xff0c;使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信&#xff08;网络通信&#xff09;&#xff0c…...

LLM调优,大模型怎么学

背景 LLM Transparency Tool 是一个用于深入分析和理解大型语言模型&#xff08;LLM&#xff09;工作原理的工具&#xff0c;旨在增加这些复杂系统的透明度。它提供了一个交互式界面&#xff0c;用户可以通过它观察、分析模型对特定输入&#xff08;prompts&#xff09;的反应…...

XLSX + LuckySheet + LuckyExcel实现前端的excel预览

文章目录 功能简介简单代码实现效果参考 功能简介 通过LuckyExcel的transformExcelToLucky方法&#xff0c; 我们可以把一个文件直接转成LuckySheet需要的json字符串&#xff0c; 之后我们就可以用LuckySheet预览excelLuckyExcel只能解析xlsx格式的excel文件&#xff0c;因此对…...

在Ubuntu上创建和启用交换文件的简单步骤

文章目录 为什么使用交换文件&#xff1f;步骤 1&#xff1a;创建交换文件步骤 2&#xff1a;设置正确的权限步骤 3&#xff1a;将文件格式化为交换空间步骤 4&#xff1a;启用交换文件步骤 5&#xff1a;验证交换文件步骤 6&#xff1a;永久启用交换文件步骤 7&#xff1a;调整…...

Java [ 基础 ] HashMap详解 ✨

目录 ✨探索Java基础 HashMap详解✨ 总述 主体 1. HashMap的基本概念 2. HashMap的工作原理 3. HashMap的常用操作 4. HashMap的优缺点 总结 常见面试题 常见面试题解答 1. HashMap的底层实现原理是什么&#xff1f; 2. 如何解决HashMap中的哈希冲突&#xff1f;…...

vue2项目迁移vue3与gogocode的使用

#背景 公司有个项目使用vue2jswebpack框架开发的&#xff0c;由于该项目内部需要安扫&#xff0c;导致很多框架出现了漏洞需要升级&#xff0c;其中主要需要从vue2升vue3,但是重新搭框架推翻重做成本太高&#xff0c;于是找到了gogocode。 #升级步骤踩坑 1. 安装 gogocode插…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...