Как раскрутить Си-макросы

Опубликовано в рубрике "Статьи", 28.11.2010.
Тэги: , , автор:

Да, знаю, сложные Си-макросы – это очень плохо. Но, иногда, без них приходится писать такую кучу кода, что неизвестно, что лучше. Вот и мне понадобилось наваять макро-кодогенератор, вот такой (только не спрашивайте, зачем 🙂 ) —

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, куда положит исходный код с развернутыми макросами.

Комментарии
  1. DeimosIsHere написал(а) 28th Ноябрь, 2010 в 11:33

    Зло. )))

  2. BSVi написал(а) 28th Ноябрь, 2010 в 11:41

    ТруЪ-зло, нужно кодогенераторы освоить. Начал было cog осваивать, но что-то питон пока меня совсем не прет, нужно пару деньков выделить, разобраться.

  3. Vovanium написал(а) 4th Декабрь, 2010 в 0:37

    Ну, хорошо написанные макросы избавляют от ночей бдения над кодогенераторами (и настройки под них IDE, скриптов сборки и т. д.) как и от тупой писанины лишнего кода. Например, макросами можно сгенерить таблицу (типа char[0x100], если надо выводить байт в порт, а ноги пришлось перепутать (типа PIN0=bit5, PIN1=bit3…) например, для подключения некоторых ЖКИ. Ради одной таблицы прицеплять кодогенератор обычно как-то не по детски лень.
    И да, в gcc тоже так можно: gcc -E, и думаю, во многих других компиляторах тоже.

  4. BSVi написал(а) 4th Декабрь, 2010 в 0:44

    Да, знаю, что у других есть, просто малоизвестная фича (или это я так от жизни отстал) вот и захотелось показать народу.

    Думается мне, что кодогенератор — еще большее зло, чем макросы. Пока стараюсь писать нативно )

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.