Макросовый экстрим. Или исскуство обфускации. В BSP от одной известной и уважаемой фирмы нашел такое:
Стоит в тексте такой вот скромный макрос
DDK_GPIO_SET_CONFIG(cfg, SDHC1);
Думаю щас его в уме раскрою.
И понеслось..
1. Находим определение
#define DDK_GPIO_SET_CONFIG(config, module) GPIOSetCfg2(GPIOValueCfgType(module), config, module)
- Переписываем и получаем следующее
GPIOSetCfg2(GPIOValueCfgType(SDHC1), cfg, SDHC1)
2. Находим определение
#define GPIOValueCfgType(module) GPIOCatMacro(GPIOCat(GPIO_, module), _CONFIG_TYPE)
- Переписываем и получаем следующее
GPIOSetCfg2(GPIOCatMacro(GPIOCat(GPIO_, SDHC1), _CONFIG_TYPE), cfg, SDHC1)
3. Находим определение
#define GPIOCat(x, y) x##y
- Переписываем и получаем следующее
GPIOSetCfg2(GPIOCatMacro(GPIO_SDHC1, _CONFIG_TYPE), cfg, SDHC1)
4. Находим определение
#define GPIOCatMacro(module, macro) GPIOCat(GPIOValueMacro, (GPIOCat2(module, macro)))
- Переписываем и получаем следующее
GPIOSetCfg2(GPIOCat(GPIOValueMacro, (GPIOCat2(GPIO_SDHC1, _CONFIG_TYPE))), cfg, SDHC1)
5. Находим определение
#define GPIOCat2(x, y) x##y
- Переписываем и получаем следующее
GPIOSetCfg2(GPIOCat(GPIOValueMacro, (GPIO_SDHC1_CONFIG_TYPE)), cfg, SDHC1)
6. Находим определение
#define GPIOValueMacro(x) x
- Переписываем и получаем следующее
GPIOSetCfg2( GPIO_SDHC1_CONFIG_TYPE, cfg, SDHC1)
7. Находим определение
#define GPIOSetCfg2(x, y, z) GPIOSetCfg3(x, y, z)
8. Находим определение
#define GPIOSetCfg3(x, y, z) GPIOCat2(GPIOCat(GPIOSetCfg, x), (y, z))
- Переписываем и получаем следующее
GPIOCat2(GPIOCat(GPIOSetCfg, GPIO_SDHC1_CONFIG_TYPE), (cfg, SDHC1))
9. Находим определение
#define GPIO_SDHC1_CONFIG_TYPE PRI
- Переписываем и получаем следующее
GPIOCat2(GPIOSetCfgPRI, (cfg, SDHC1))
- Переписываем и получаем следующее
GPIOSetCfgPRI(cfg, SDHC1)
Итого оказывается:
DDK_GPIO_SET_CONFIG(cfg, SDHC1) -> GPIOSetCfgPRI(cfg, SDHC1)
Фу.уу..
Думаете на этом все кончилось?
Нет!
GPIOSetCfgPRI - тоже оказалось макросом!