尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【C/C++】X-Macro技术 配置宏

【C/C++】X-Macro技术 配置宏
📅 发布时间:2026/6/20 9:43:13
#ifndef _LED_CONFIG_H
#define _LED_CONFIG_H/*============================================================================**                        基础定义*============================================================================*//* LED颜色定义 */
#define COLOR_RED     0x01
#define COLOR_GREEN   0x02  
#define COLOR_BLUE    0x04
#define COLOR_YELLOW  (COLOR_RED | COLOR_GREEN)
#define COLOR_WHITE   (COLOR_RED | COLOR_GREEN | COLOR_BLUE)/* 闪烁模式定义 */
#define BLINK_OFF     0    /* 常亮 */
#define BLINK_SLOW    1    /* 慢闪:1Hz */
#define BLINK_FAST    2    /* 快闪:5Hz */
#define BLINK_BREATH  3    /* 呼吸灯效果"/* 场景ID定义 */
#define SCENE_NORMAL   1
#define SCENE_WARNING  2
#define SCENE_ERROR    3
#define SCENE_STANDBY  4/*================ 1. 定义LED场景配置表 ================*/
#define LED_SCENE_TABLE \/* id, 颜色,        闪烁模式,     亮度, 描述 */ \X(SCENE_NORMAL,   COLOR_GREEN,  BLINK_OFF,    100, "系统正常") \X(SCENE_WARNING,  COLOR_YELLOW, BLINK_SLOW,   80,  "系统警告") \X(SCENE_ERROR,    COLOR_RED,    BLINK_FAST,   100, "系统错误") \X(SCENE_STANDBY,  COLOR_BLUE,   BLINK_BREATH, 30,  "系统待机")/*================ 2. 当前场景选择 ================*/
#define CURRENT_SCENE_ID    SCENE_NORMAL/*================ 3. X-Macro自动展开系统 ================*//* 第一步:清除可能存在的旧定义 */
#undef LED_COLOR
#undef LED_BLINK_MODE
#undef LED_BRIGHTNESS
#undef LED_DESCRIPTION/* 辅助宏:字符串连接 */
#define CONCAT(a, b) a##b
#define CONCAT3(a, b, c) a##b##c/* 第二步:使用X-Macro自动生成每个场景的配置宏 */
#define X(id, color, blink, brightness, desc) \#define CONCAT3(id, __, COLOR)      color \#define CONCAT3(id, __, BLINK)      blink \#define CONCAT3(id, __, BRIGHTNESS) brightness \#define CONCAT3(id, __, DESC)       desc/* 展开配置表,生成所有场景的宏 */
LED_SCENE_TABLE
#undef X/* 第三步:根据当前场景选择配置 */
#define _SELECT_COLOR(id)        CONCAT3(id, __, COLOR)
#define _SELECT_BLINK(id)        CONCAT3(id, __, BLINK)
#define _SELECT_BRIGHTNESS(id)   CONCAT3(id, __, BRIGHTNESS)
#define _SELECT_DESC(id)         CONCAT3(id, __, DESC)/* 第四步:应用选中的配置 */
#define LED_COLOR      _SELECT_COLOR(CURRENT_SCENE_ID)
#define LED_BLINK_MODE _SELECT_BLINK(CURRENT_SCENE_ID)
#define LED_BRIGHTNESS _SELECT_BRIGHTNESS(CURRENT_SCENE_ID)
#define LED_DESCRIPTION _SELECT_DESC(CURRENT_SCENE_ID)/*============================================================================**                        函数式宏*============================================================================*//* 判断是否是某个颜色 */
#define IS_RED_LED()      ((LED_COLOR & COLOR_RED) != 0)
#define IS_GREEN_LED()    ((LED_COLOR & COLOR_GREEN) != 0)
#define IS_BLUE_LED()     ((LED_COLOR & COLOR_BLUE) != 0)/* 判断闪烁模式 */
#define IS_BLINKING()     (LED_BLINK_MODE != BLINK_OFF)
#define IS_BREATHING()    (LED_BLINK_MODE == BLINK_BREATH)/* 亮度相关 */
#define IS_BRIGHT()       (LED_BRIGHTNESS > 70)
#define IS_DIM()          (LED_BRIGHTNESS < 40)/*============================================================================**                        使用示例*============================================================================*/#ifdef __cplusplus
extern "C" {
#endif/* 根据配置控制LED的实际函数 */
void led_init(void);
void led_set_color(int color);
void led_set_blink(int mode);
void led_set_brightness(int percent);/* 初始化LED(使用配置) */
void init_led_from_config(void) {led_set_color(LED_COLOR);led_set_blink(LED_BLINK_MODE);led_set_brightness(LED_BRIGHTNESS);/* 使用函数式宏 */if (IS_BLINKING()) {/* 处理闪烁逻辑 */}if (IS_RED_LED() && IS_BRIGHT()) {/* 红色高亮时的特殊处理 */}
}#ifdef __cplusplus
}
#endif#endif /* _LED_CONFIG_H */

🔧 工作原理说明:

  1. 配置表是唯一数据源:所有场景配置只在LED_SCENE_TABLE中定义一次

  2. 自动展开:通过X宏自动为每个场景生成对应的配置宏:

    • SCENE_NORMAL__COLOR

    • SCENE_NORMAL__BLINK

    • SCENE_NORMAL__BRIGHTNESS

    • SCENE_NORMAL__DESC

  3. 动态选择:根据CURRENT_SCENE_ID选择对应的宏

  4. 最终配置:生成LED_COLOR、LED_BLINK_MODE等最终配置宏

📝 验证扩展性:

要添加新场景,只需要在配置表中加一行:

c
#define LED_SCENE_TABLE \/* id, 颜色,        闪烁模式,     亮度, 描述 */ \X(SCENE_NORMAL,   COLOR_GREEN,  BLINK_OFF,    100, "系统正常") \X(SCENE_WARNING,  COLOR_YELLOW, BLINK_SLOW,   80,  "系统警告") \X(SCENE_ERROR,    COLOR_RED,    BLINK_FAST,   100, "系统错误") \X(SCENE_STANDBY,  COLOR_BLUE,   BLINK_BREATH, 30,  "系统待机") \X(SCENE_DEBUG,    COLOR_WHITE,  BLINK_FAST,   50,  "调试模式")  /* 新增 *//* 定义新场景ID */
#define SCENE_DEBUG    5/* 修改当前场景即可切换 */
#define CURRENT_SCENE_ID    SCENE_DEBUG

这样,所有配置都会自动生成,无需手动定义其他宏。这才是真正的X-Macro自动展开!

相关新闻

  • 【权威评测】Open-AutoGLM与Postman性能实测对比:响应速度、稳定性、扩展性全解析
  • 每日三题 11
  • 基于Java的固定资产智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

最新新闻

  • 小学生书法评比线上票选,微信投票创建教程 - 微信投票小程序
  • 终极指南:如何突破Flash访问限制?CefFlashBrowser完整解决方案
  • 2026年舟山市贵金属旧料回收优质靠谱实体门店精选五家 黄金回收铂金回收白银回收彩金回收真实探店测评清单及联系方式推荐 - 前途无量YY
  • Grok-3 v3.2.4热更新深度解析:大模型工程化落地的毫米级优化
  • 伊犁黄金回收2026年6月实测:六家正规商家大盘价减3至10元全城上门 - 余生黄金回收
  • 舞蹈赛事专用视频投票小程序,哪款防刷无广告好用?永久免费零广告实测推荐 - 微信投票小程序

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号