「C/C++」C/C++预处理 之 X宏(X Macro)

news2024/11/28 4:29:23

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • X宏(X Macro)
      • 工作原理
      • 示例
      • 优点
      • 注意事项

X宏(X Macro)

X宏是一种在C和C++编程中使用的预处理技术,它允许程序员在单个位置定义一组相关的宏,然后在多个上下文中重用这些宏,而无需复制粘贴代码。这种技术特别适用于需要定义大量相关常量、枚举值、函数原型或类成员的场景。

工作原理

X宏的核心思想是将宏定义放在一个单独的文件(通常是头文件)中,并使用一个特殊的预处理指令(通常是#define后跟一个特殊的标识符,如X)来标记宏定义的开始和结束。然后,在需要这些宏的源文件中,通过包含这个头文件并重新定义X宏来生成所需的代码。

示例

假设我们有一个包含颜色名称和对应整数值的枚举,我们想要在不同的上下文中重用这些颜色定义。

colors.h(X宏定义文件):

#define COLORS_X(X) \
    X(RED, 1)       \
    X(GREEN, 2)     \
    X(BLUE, 3)      \
    // 可以继续添加更多颜色

// 注意:这里没有#endif,因为这是一个独立的头文件片段

colors_enum.h(生成枚举):

#ifndef COLORS_ENUM_H
#define COLORS_ENUM_H

#include "colors.h"

typedef enum {
#define X(name, value) name = value,
    COLORS_X(X)
#undef X
    COLORS_COUNT // 可选的,表示颜色总数
} Color;

#endif // COLORS_ENUM_H

colors_strings.h(生成字符串数组):

#ifndef COLORS_STRINGS_H
#define COLORS_STRINGS_H

#include "colors.h"

#define X(name, value) #name,
const char* colorNames[] = {
    COLORS_X(X)
};
#undef X

#endif // COLORS_STRINGS_H

main.c(使用生成的枚举和字符串数组):

#include <stdio.h>
#include "colors_enum.h"
#include "colors_strings.h"

int main() {
    for (int i = 0; i < COLORS_COUNT; ++i) {
        printf("Color %d: %s\n", i, colorNames[i]);
    }
    return 0;
}

在这个例子中,COLORS_X宏在colors.h中定义了一组颜色名称和值。然后,在colors_enum.h中,我们通过重新定义X宏来生成一个枚举类型Color。在colors_strings.h中,我们再次重新定义X宏来生成一个字符串数组colorNames,其中包含每个颜色的名称。最后,在main.c中,我们包含了这些头文件并使用生成的枚举和字符串数组。

优点

  • 代码重用:通过在一个位置定义宏,并在多个上下文中重用它们,可以减少代码重复。
  • 易于维护:如果需要添加、删除或修改颜色定义,只需在colors.h中进行更改。
  • 灵活性:通过重新定义X宏,可以生成不同形式的代码(如枚举、字符串数组、函数原型等)。

注意事项

  • 命名冲突:确保X宏和任何相关的标识符(如COLORS_X)在全局命名空间中不会与其他代码冲突。
  • 可读性:虽然X宏可以提高代码的可维护性,但它们可能会降低代码的可读性,特别是对于不熟悉这种技术的程序员来说。因此,在团队项目中使用时,应确保所有成员都理解这种技术。
  • 预处理器限制:由于X宏依赖于预处理器指令,因此它们受到预处理器限制的影响(如宏展开的最大长度)。在定义大量宏时,应注意这些限制。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2227705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构————map,set详解

今天带来map和set的详解&#xff0c;保证大家分清楚 一&#xff0c;概念 map和set是一种专门用来搜索的容器或数据结构 map能存储两个数据类型&#xff0c;我们称之为<key-value>模型 set只能存储一个数据类型&#xff0c;我们称之为纯<key>模型 它们的效率都非…

APISQL企业版离线部署教程

针对政务、国企、医院、军工等内网物理隔离的客户&#xff0c;有时需要多次摆渡才能到达要安装软件的服务器。本教程将指导您使用Linux和Docker Compose编排服务&#xff0c;实现APISQL的离线部署。 准备 准备一台Linux(x86_64)服务器。 安装Docker Engine&#xff08;推荐版本…

DC-1渗透测试

DC1 五个flag的拿取&#xff08;截图是五个flag里面的内容&#xff09; 注意事项&#xff1a;kali的用户名&#xff1a;root 密码&#xff1a;kali 注意&#xff1a;DC1 只要开机服务就起来了 思路&#xff1a;信息收集—> 寻找漏洞—> 利用漏洞(sql注入,文件上传漏洞…

uniapp的IOS证书申请(测试和正式环境)及UDID配置流程

1.说明 本教程只提供uniapp在ios端的证书文件申请&#xff08;包含正式环境和开发环境&#xff09;、UDID配置说明&#xff0c;请勿用文档中的账号和其他隐私数据进行测试&#xff0c;请勿侵权&#xff01; 2.申请前准备 证书生成网站&#xff1a;苹果应用上传、解析&#x…

vxe-table 表格中使用输入框、整数限制、小数限制,单元格渲染数值输入框

Vxe UI vue vxe-table 表格中使用输入框、整数限制、小数限制&#xff0c;单元格渲染数值输入框 在 vxe-table v4.7 单元格中渲染有非常多的方式&#xff0c;可以使用自带的组件&#xff0c;也可以已使用第三方的组件 element ui 之类的。本章介绍如果使用自带的输入框&#x…

Negative Sampling in Recommendation: A Survey and Future Directions

目录 Introduction分类&#xff1a;静态负采样策略动态负采样策略对抗负采样策略重要性重加权策略知识增强负采样策略多种推荐场景的负采样 Introduction 传统的推荐算法通常关注用户的正面历史行为&#xff0c;而忽视了负面反馈在理解用户兴趣中的重要作用。负面采样是推荐系…

Java IO 模型

I/O 何为 I/O? I/O&#xff08;Input/Output&#xff09; 即输入&#xff0f;输出 。 我们先从计算机结构的角度来解读一下 I/O。 根据冯.诺依曼结构&#xff0c;计算机结构分为 5 大部分&#xff1a;运算器、控制器、存储器、输入设备、输出设备。 输入设备&#xff08;比…

MFC实现以不规则PNG图片作为窗口背景

效果图 显示的不规则PNG图片 头文件 #pragma once #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib")// CShowBack 对话框class CShowBack : public CDialogEx {DECLARE_DYNAMIC(CShowBack) public:CShowBack(CWnd* pParent nullptr); // 标准构…

数字IC开发:布局布线

数字IC开发&#xff1a;布局布线 前端经过DFT&#xff0c;综合后输出网表文件给后端&#xff0c;由后端通过布局布线&#xff0c;将网表转换为GDSII文件&#xff1b;网表文件只包含单元器件及其连接等信息&#xff0c;GDS文件则包含其物理位置&#xff0c;具体的走线&#xff1…

HarmonyOS 5.0应用开发——Navigation实现页面路由

【高心星出品】 文章目录 Navigation实现页面路由完整的Navigation入口页面子页面 页面跳转路由拦截其他的 Navigation实现页面路由 Navigation&#xff1a;路由导航的根视图容器&#xff0c;一般作为页面&#xff08;Entry&#xff09;的根容器去使用&#xff0c;包括单页面&…

Flink CDC系列之:学习理解核心概念——Data Pipeline

Flink CDC系列之&#xff1a;学习理解核心概念——Data Pipeline 数据管道sourcesink管道配置Table IDroutetransform案例 数据管道 由于 Flink CDC 中的事件以管道方式从上游流向下游&#xff0c;因此整个 ETL 任务被称为数据管道。 管道对应于 Flink 中的一系列操作。 要描…

25届电信保研经验贴(清华大学电子工程系,工程硕博)

个人背景 学校&#xff1a;中九 专业&#xff1a;电子信息工程 加权&#xff1a;92.89 绩点&#xff1a;3.91/4.0 rank&#xff1a;前五学期rank2/95&#xff0c;综合排名rank1&#xff08;前六学期和综合排名出的晚&#xff0c;实际上只用到了前五学期&#xff09; 科研…

安卓取消触摸屏幕的指针效果

在安卓系统中&#xff0c;取消触摸屏幕的指针效果&#xff08;通常指开发者模式下的屏幕点按反馈显示或指针位置显示&#xff09;可以通过ADB&#xff08;Android Debug Bridge&#xff09;命令来实现。以下是具体的步骤和命令&#xff1a; 使用ADB命令取消触摸屏幕的指针效果 …

数据库基础介绍

前言&#xff1a; 在当今信息化、数字化的时代&#xff0c;数据库是支撑一切信息系统的核心基础设施。无论是金融机构的账户管理、电商平台的商品库存&#xff0c;还是社交媒体的用户信息&#xff0c;数据库都在背后扮演着关键角色数据库不仅用于存储和管理数据&#xff0c;更…

使用AMD GPU和LangChain构建问答聊天机器人

Question-answering Chatbot with LangChain on an AMD GPU — ROCm Blogs 作者&#xff1a;Phillip Dang 2024年3月11日 LangChain是一个旨在利用语言模型强大功能来构建前沿应用程序的框架。通过将语言模型连接到各种上下文资源并基于给定的上下文提供推理能力&#xff0c;L…

一篇文章总结 SQL 基础知识点

1. 官方文档 MySQL&#xff1a;https://dev.mysql.com/doc/refman/8.4/en/ SQL Server&#xff1a;What is SQL Server? - SQL Server | Microsoft Learn Oracle&#xff1a;https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loe.html 2. 术语 SQL S…

【Java数据结构】树】

【Java数据结构】树 一、树型结构1.1 概念1.2 特点1.3 树的类型1.4 树的遍历方式1.5 树的表示形式1.5.1 双亲表示法1.5.2 孩子表示法1.5.3 孩子双亲表示法1.5.4 孩子兄弟表示法 二、树型概念&#xff08;重点&#xff09; 此篇博客希望对你有所帮助&#xff08;帮助你了解树&am…

【MyBatis源码】SqlSource对象创建流程

文章目录 介绍XMLScriptBuilder初始化parseDynamicTags解析动态节点RawSqlSource分析代码分析实例化 介绍 代码入口&#xff1a; SqlSource sqlSource langDriver.createSqlSource(configuration, context, parameterTypeClass);languageRegistry&#xff1a;用于注册Langua…

centos下面的jdk17的安装配置

文章目录 1.基本指令回顾2.jdk17的安装到这个centos上面2.1首先切换到这个root下面去2.2查看系统jdk版本2.3首先到官网找到进行下载2.4安装包的上传2.5jdk17的安装包的解压过程2.6配置环境变量2.7是否设置成功&#xff0c;查看版本 1.基本指令回顾 ls:list也就是列出来这个目录…

基于Multisim的数字温度计设计与仿真

1.设计测量范围为 0℃到 99℃的数字温度计 2.可实时显示温度 3.精度误差小于 1℃ 4.LED 数码直读显示温度大小 链接&#xff1a;https://pan.baidu.com/s/1isIHpMESTBTf2T2SY9-iPw 提取码&#xff1a;qh4o