案例解析)
X-Macro 模式解讀這是 C/C 中經(jīng)典的X-Macro技術(shù)核心思想是一份數(shù)據(jù)定義多種用途展開。數(shù)據(jù)源唯一真源在 light_strip_config.h 中LIGHT_SCENE_STRIP_CONFIGS 是所有燈條配置的唯一列表#defineLIGHT_SCENE_STRIP_CONFIGS(X)\X(LIGHT_STRIP_FRONT_MAIN,FRONT_MAIN_LIGHT_WS2812FX,FRONT_MAIN_LIGHT_NUMS,kMaskBaseAnimSignal)\X(LIGHT_STRIP_FRONT_GRILLE_SIDE,...)\X(LIGHT_STRIP_MIRROR,...)\...共21條...它本身不生成任何代碼——它只是接收一個操作符然后對每條燈帶調(diào)用一次 X(燈帶ID, 燈帶對象, 燈帶LED數(shù), 層掩碼)。三次不同展開在 light_scene_manager.cpp 中同一個數(shù)據(jù)源被用作三種不同的用途用途1構(gòu)建配置數(shù)組#defineLIGHT_SCENE_CONFIG_ENTRY(strip_id,strip_obj,strip_len,strip_mask)\{strip_obj,strip_len,strip_mask},staticStripConfig kStripConfigs[LIGHT_STRIP_COUNT]{LIGHT_SCENE_STRIP_CONFIGS(LIGHT_SCENE_CONFIG_ENTRY)// X LIGHT_SCENE_CONFIG_ENTRY};#undefLIGHT_SCENE_CONFIG_ENTRY展開后等價于staticStripConfig kStripConfigs[21]{{FRONT_MAIN_LIGHT_WS2812FX,FRONT_MAIN_LIGHT_NUMS,kMaskBaseAnimSignal},{FRONT_GRILLE_SIDE_WS2812FX,FRONT_GRILLE_SIDE_NUMS,kMaskBaseAnimSignal},// ... 共21條};用途2統(tǒng)計總像素數(shù)#defineLIGHT_SCENE_PIXEL_SUM(strip_id,strip_obj,strip_len,strip_mask)(strip_len)constuint16_tkTotalScenePixels0LIGHT_SCENE_STRIP_CONFIGS(LIGHT_SCENE_PIXEL_SUM);// ↑ 初始值0// ↑ 然后展開為 (燈珠數(shù)1) (燈珠數(shù)2) ... 總和用途3統(tǒng)計 active byte 總數(shù)#defineLIGHT_SCENE_ACTIVE_BYTE_SUM(strip_id,strip_obj,strip_len,strip_mask)activeByteCount(strip_len)constuint16_tkTotalSceneActiveBytes0LIGHT_SCENE_STRIP_CONFIGS(LIGHT_SCENE_ACTIVE_BYTE_SUM);為什么這么寫優(yōu)勢說明單一數(shù)據(jù)源增刪改燈帶只改 light_strip_config.h 一處編譯時計算數(shù)組大小、像素總數(shù)都在編譯期確定零運行時開銷不會遺漏數(shù)組、統(tǒng)計量、后續(xù)可能的其他展開都自動覆蓋所有燈帶簡單說LIGHT_SCENE_STRIP_CONFIGS 是數(shù)據(jù)菜單而三次#define … #undef是三個不同的廚師拿著同一份菜單做出三道不同的菜。