强大的 #define XXX / #include XXX / #undef 用法

C/C++预编译指令与宏定义:从原理到实战的完整指南 预编译指令是C/C++编译过程中的关键环节,它在编译器进行语法分析前对源代码进行文本处理。其核心原理是通过预处理器执行宏展开、文件包含和条件编译等操作,从而控制代码的最终编译形态。这一机制的技术价值在于实现代码复用、平台适配和编译期配置,是构建大型可维护项目的基石。在工程实践中,预编译指令广泛应用于解决头文件重复包含、定义编译开关和实现跨平台代码等场景。其中,宏定义作为最常用的功能,通过文本替换简化代码,但也需警惕参数多次求值和运算符优先级等陷阱。本文深入解析了预编译指令的工作流程,并提供了头文件守卫、宏函 阅读详情

今天看到一种宏定义#define结合#include的用法很强大,把心得记录下来分享。

 

头文件 sample.h

#ifdef DECLARE_SAMPLE_EVENT

DECLARE_SAMPLE_EVENT(EVENT1, CEvent1, "事件1")

DECLARE_SAMPLE_EVENT(EVENT2, CEvent2, "事件2")

DECLARE_SAMPLE_EVENT(EVENT3, CEvent3, "事件3")

#endif

 

然后在头文件 event.h 中,我想对event定义一个枚举和为每个状态定义一个类

// 对事件类型枚举定义

enum E_EVENT

{

#define DECLARE_SAMPLE_EVENT(event, classname, note)    event,

#include "sample.h"

#undef DECLARE_SAMPLE_EVENT

    EVENT_MAX

};

这里很巧妙的把 DECLARE_SAMPLE_EVENT(event, classname, note)用宏定义为了event,

也就是 DECLARE_SAMPLE_EVENT(EVENT1, classname, "事件1") 变成了 EVENT1

 

#include "sample.h",相当于把sample中里的代码引用了进来。

于是宏定义还原后,代码内容就是

enum E_EVENT

{

    
解决C++项目中TBB、Qt与MSVC编译冲突:emit与min/max宏问题实战指南 在C++跨平台开发中,预处理器宏和命名冲突是常见的编译难题,尤其在集成多个第三方库时。这类问题通常源于不同库对C++标准或关键字的差异化处理,导致代码在预处理阶段被意外展开或替换。其技术价值在于,理解并解决这些冲突是构建稳定、可维护大型项目的基石,直接影响编译成功率和团队协作效率。应用场景广泛,涵盖高性能计算、图形界面开发、游戏引擎及桌面应用等领域,其中集成Intel TBB进行并行计算与使用Qt框架构建GUI是典型组合。本文聚焦于该组合在Windows MSVC环境下最突出的两个编译冲突:因Windows 阅读详情

相关推荐

C/C++条件编译进阶:掌握#if defined()语法与工程实践

条件编译是C/C++预处理阶段的核心机制,它允许开发者在编译前根据特定条件选择性地包含或排除代码段。其原理基于预处理器对宏定义和表达式的求值,通过#ifdef、#ifndef和#if等指令实现。这项技术的核心价值在于提升代码的可移植性和可配置性,能够高效管理不同硬件平台、编译器版本和功能模块的代码差异。在嵌入式开发、MCU编程和跨平台软件构建等场景中,条件编译是实现单一代码库适配多环境的关键手段。本文聚焦于#if defined()这一进阶语法,它突破了#ifdef只能检查单个宏存在的限制,支持通过逻辑运算

weixin_30693683的博客 543

C语言枚举深度解析:从类型安全到状态机实战应用

在C语言编程中,定义常量是基础且常见的需求。传统上,开发者可能使用`#define`宏或`const`变量,但这些方式在类型安全和代码语义表达上存在局限。枚举(enum)作为一种用户自定义类型,其核心原理在于将一组逻辑相关的整型常量封装为一个独立的类型,从而在编译层面提供更强的语义约束和代码自文档化能力。这一特性在构建清晰、健壮的软件架构时具有重要技术价值,尤其在需要明确限定变量取值范围、提升代码可读性和可维护性的场景下。例如,在实现**状态机**或管理**配置选项**时,枚举能清晰地定义有限的状态集合或选

weixin_34008805的博客 884

STM32工程模板搭建指南:从零构建标准外设库项目框架

在嵌入式开发中,工程模板是提升开发效率和代码可维护性的基础。其核心原理在于通过合理的目录结构设计,实现代码模块化与分层管理,从而分离稳定的官方库、可复用的硬件驱动以及用户应用代码。这种架构的技术价值在于,它遵循了高内聚低耦合的设计思想,不仅便于团队协作与版本控制,更能显著降低后续项目的搭建与移植成本。典型的应用场景包括基于Cortex-M系列微控制器的产品开发、教学实验以及个人学习项目。本文以STM32标准外设库为例,详细解析了在Keil MDK环境下,如何从零开始搭建一个结构清晰、易于移植的工程模板,并深

weixin_33842304的博客 362

C语言预处理机制深度解析:从宏定义到条件编译的实战指南

在C语言编程中,预处理是编译前不可或缺的关键环节,它通过文本替换和条件编译等机制,为代码的模块化、平台适配和性能优化奠定基础。预处理的核心原理在于处理以#开头的指令,如#include用于文件包含,#define用于宏定义,以及#if、#ifdef等用于条件编译。这些技术不仅提升了代码的灵活性和可维护性,还在调试版本管理、跨平台开发等场景中发挥重要作用。例如,通过宏定义可以实现高效的调试日志输出,而条件编译则能轻松切换不同平台的代码实现。本文聚焦C语言预处理的实战应用,深入探讨宏的字符串化与连接运算符等高级

weixin_33743703的博客 388

Cosmopolitan Libc:C/C++跨平台开发新范式,一次编译多平台运行

在C/C++开发领域,跨平台兼容性一直是开发者面临的重大挑战,传统方案依赖交叉编译或虚拟机环境,导致部署复杂且性能受限。其技术原理在于通过创新的多格式二进制文件设计,将程序与精简的C标准库静态链接,形成自包含的可执行文件。这种技术价值在于彻底解决了动态库依赖和系统ABI差异问题,实现了真正的“一次构建,到处运行”。在应用场景上,特别适合命令行工具、嵌入式应用和教育演示等需要简化部署的领域。Cosmopolitan Libc通过其独特的APE格式和工具链,让开发者能够构建出同时兼容Linux、macOS和Wi

weixin_30387423的博客 362

深入解析Kconfig语法:从配置项到依赖关系的完整指南

在嵌入式开发和Linux内核构建中,配置管理是确保软件可定制性和可维护性的核心环节。Kconfig作为一种声明式的领域特定语言(DSL),通过定义配置项、菜单结构和约束关系,为大型项目如Linux内核提供了灵活的配置建模能力。其语法支持布尔型、三态型、字符串和整数等多种配置类型,并通过depends on、select和imply等关键字实现复杂的依赖逻辑与可见性控制。掌握Kconfig不仅能帮助开发者理解配置背后的原理,还能提升在系统定制、驱动开发及构建系统集成中的实践能力。本文以实际工程场景为例,详解K

weixin_30522095的博客 343

华为硬件工程师笔试题

1、基尔霍夫定理的内容是什么?(仕兰微电子)   基尔霍夫定理包括电流定律和电压定律。   电流定律(KCL):在集总电路中,任何时刻,对任一结点,所有流出结点的支路电流的代数和恒等于零。   电压定律(KVL):在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于零。   2、平板电容公式(C=εS/4πkd)。(未知)   3、最基本的如三极管曲线特性。(未知)   4、描述反馈电路...

weixin_33717117的博客 2万+

【kubeEdge】离线部署

根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。

qq_42944740的博客 1716

2025-08-19利用opencv检测图片中文字及图片的坐标

该代码实现了图片中中文文本的检测与位置计算功能。主要使用CnOcr库进行OCR识别,结合OpenCV和PIL库处理图像。功能包括:1)检测图片中的中文文本及位置坐标;2)计算每个文本的像素宽度和高度;3)在原图上绘制文本边界框并标注识别结果。代码通过put_chinese_text函数解决中文显示问题,最终输出各文本内容、坐标位置及尺寸信息。适用于需要获取图片中文字精确位置的应用场景。

m0_58149406的博客 395

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

由于Milvus官方文档只提及如何使用docker安装部署Milvus,关于源码安装方式篇幅较少,因此,我整理撰写了如何通过源码编译方式成功安装Milvus,详见此篇。之所以选择这种复杂的安装方式,可以调试源码进而熟悉Milvus如何搭建整个框架支持AI上层应用功能。根据上篇步骤部署虽然可以成功,然而,我却不能成功启动Milvus服务,这个问题困扰了一两天,现在终于得以解决并能成功调试Milvus源码。接下来,分为三个部分介绍如何启动和成功调试。

qq_43893755的博客 3368

论文必备 - YOLOv13热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv13热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 488

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 732

【YOLOv26 源码深度解析】第三章:YOLOv26特征融合(Neck)模块

路径聚合网络作为YOLOv26 Neck部分的核心组件,在继承特征金字塔网络(FPN)自顶向下语义传播能力的基础上,引入了自底向上的路径增强机制,构建起双向跨层特征融合体系。该架构通过建立多尺度特征间的双向信息流,有效缓解了深层网络中细节信息逐层衰减的问题,使得模型在保持高层语义理解能力的同时,能够精确定位不同尺度的目标实例。跨层深度监督的另一优势在于增强特征的尺度适应性。对于来自上层路径的特征与横向连接的特征,融合过程首先对各路特征进行加权,随后进行归一化处理,最终通过加法或拼接操作生成融合特征。

u012133341的博客 520

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

下一篇: 面试题0001
lshadow
博客等级 码龄25年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值