Как раскрутить Си-макросы
Да, знаю, сложные Си-макросы – это очень плохо. Но, иногда, без них приходится писать такую кучу кода, что неизвестно, что лучше. Вот и мне понадобилось наваять макро-кодогенератор, вот такой (только не спрашивайте, зачем 🙂 ) —
1#define EXPORT_CLASS_FUNC_0(class_name, func_name) \
2 DevResult class_name ##_ ##func_name() { \
3 DevResult result; \
4 try { result = GetMyInstance()-›##func_name(); } \
5 catch(…) { return DEVRESULT_ERR; } \
6 return result; }
Но как увидеть, что он нагенерил? Оказывается, все просто. Для этого, запускаем cpp компилятор от Visual Studio со следующими ключами:
1cl.exe /P /C имя_файла.cpp
Он создаст файл имя_файла.i, куда положит исходный код с развернутыми макросами.
Зло. )))
ТруЪ-зло, нужно кодогенераторы освоить. Начал было cog осваивать, но что-то питон пока меня совсем не прет, нужно пару деньков выделить, разобраться.
Ну, хорошо написанные макросы избавляют от ночей бдения над кодогенераторами (и настройки под них IDE, скриптов сборки и т. д.) как и от тупой писанины лишнего кода. Например, макросами можно сгенерить таблицу (типа char[0x100], если надо выводить байт в порт, а ноги пришлось перепутать (типа PIN0=bit5, PIN1=bit3…) например, для подключения некоторых ЖКИ. Ради одной таблицы прицеплять кодогенератор обычно как-то не по детски лень.
И да, в gcc тоже так можно: gcc -E, и думаю, во многих других компиляторах тоже.
Да, знаю, что у других есть, просто малоизвестная фича (или это я так от жизни отстал) вот и захотелось показать народу.
Думается мне, что кодогенератор — еще большее зло, чем макросы. Пока стараюсь писать нативно )