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

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

#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_COLORLED_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自动展开!

http://www.jsqmd.com/news/119675/

相关文章:

  • 下载 | Win7系统最新版ISO映像(集成12月最新补丁、旗舰版、完整纯净无精简、64位/32位可选、Windows 7)
  • 3D
  • Open-AutoGLM与SoapUI功能协同差异全解析(90%工程师忽略的关键细节)
  • 2025隐形车衣哪家强?这5家口碑门店不容错过!贴车衣/贴隐形车衣/汽车车衣/贴太阳膜/汽车贴膜/车衣改色门店推荐榜单 - 品牌推荐师
  • 接口测试新纪元:Open-AutoGLM与Postman联动差异深度剖析(内含性能实测数据)
  • 【广州征婚:我花了2万块也没找到真爱,直到20元征婚网】
  • 每日三题 11
  • Open-AutoGLM 与 BrowserStack 兼容性对比(稀缺内部数据首次公开)
  • 基于Java的团员信息智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 2025年浙江评价好的GEO品牌哪家好,deepseek优化/豆包优化/GEO优化服务/GEO品牌推荐榜单 - 品牌推荐师
  • CANN与机器视觉
  • 省钱必看!2025新洲黄沙厂家价格战,哪家更便宜?评价高的黄沙厂商赋能企业生产效率提升与成本优化 - 品牌推荐师
  • html,css一些知识点
  • Open-AutoGLM vs JMeter:性能测试如何选择?3大维度全面解析
  • 【Open-AutoGLM与Tricentis Tosca深度对比】:揭秘两大自动化测试引擎的适配差异与选型关键
  • Open-AutoGLM集成Sauce Labs常见报错,5分钟定位并解决的终极方案
  • Open-AutoGLM与Cypress如何抉择?揭秘大厂在移动端自动化中的真实技术选型逻辑
  • 基于Java的园区咨询服务智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 智能体群体在市场异常检测中的应用
  • 基于Java的园区物业智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 移动测试平台怎么选?Open-AutoGLM与Perfecto的7项硬核对比告诉你答案
  • 为什么90%的顶尖团队开始转向Open-AutoGLM?与BrowserStack的4项对比揭秘
  • 为什么你的自动化测试总失败?(Open-AutoGLM与SOAtest集成痛点全解析)
  • 光伏储能系统Simulink仿真:光照变化下的电源管理与负载调节策略研究
  • 【独家评测】Open-AutoGLM挑战Applitools:准确率提升40%的秘密
  • 【Open-AutoGLM vs UFT Mobile深度对比】:揭秘两大自动化测试平台的核心差异与选型策略
  • 【Open-AutoGLM与JMeter性能测试终极对比】:揭秘两者协同优化的5大核心场景
  • 【开题答辩全过程】以 基于Vuejs汽车租赁系统的设计与实现为例,包含答辩的问题和答案
  • 解析 `useDeferredValue` 对渲染管线的阻塞:它是如何在“后台”默默生成低优先级 Fiber 树的?
  • 还在用BrowserStack?Open-AutoGLM的这6个兼容性优势你必须知道