【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 */
🔧 工作原理说明:
-
配置表是唯一数据源:所有场景配置只在
LED_SCENE_TABLE中定义一次 -
自动展开:通过X宏自动为每个场景生成对应的配置宏:
-
SCENE_NORMAL__COLOR -
SCENE_NORMAL__BLINK -
SCENE_NORMAL__BRIGHTNESS -
SCENE_NORMAL__DESC
-
-
动态选择:根据
CURRENT_SCENE_ID选择对应的宏 -
最终配置:生成
LED_COLOR、LED_BLINK_MODE等最终配置宏
📝 验证扩展性:
要添加新场景,只需要在配置表中加一行:
#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自动展开!

浙公网安备 33010602011771号