hell0w0rd
@hell0w0rd
Просто разработчик

Зачем в современных проектах все еще используются макросы?

В замен мне кажутся очевидным решением inline функции. Самый главный плюс - функция понятнее, чем макрос, у нее хотя-бы подсветка есть.
  • Вопрос задан
  • 3589 просмотров
Решения вопроса 1
bogolt
@bogolt
Макросы нужны там где нужно во время компиляции программы генерировать код. Функции или даже шаблоны для этого не подходят.
Например вы хотите логгер, который бы писал в каком файле, и на какой строке произошла ошибка, вы пишите код

cout << __FILE__ << __LINE__ << "error message";

И все хорошо пока вы его вставляете руками туда куда нужно. Но вот вы решили что это некрасиво, и планируете вынести код в функцию. Однако - план проваливается, так как теперь код пишет каждый раз один и тот же файл, и одну и ту же строку - ту самую в которой код удобно расположился в вашей функции. Выходов два:
- каждый раз дублировать этот код
- использовать макросы

Итак теперь вы тяжело вздохнув, и закрыв портретик Страуструпа шторкой ( чтобы не видел как вы предаетесь адскому макросостроению ) пишите макрос
#define LOG(x) std::cout << __FILE__ << __LINE__ << x << std::endl;


Теперь где угодно можно писать
LOG("this is error number " << errno);
и все будет работать как и было запланировано.

Еще из полезных свойств макросов - улучшать чужой плохой код. Если у вас есть много переменных, или переменных имена у которых почти совпадают с именами функций и вам нужно сделать этот код умнее, вы пользуетесь макросами, склеиваете строки через ## или преобразовываете переменную в строку через #
Это довольно мощные инструменты ( пусть до лисповских максросов им далеко ) которые реально позволяют улучшить код и/или избежать кучу повторений одного и того же блока кода.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@malerix
"Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Lisp". Так что макросы нужны.
Попробуйте "заинлайнить" вот это:
#define FOO_MAGIC protected: foo someMagicFunction(){...} foo Bar;
// далее - мешанина из \ template typedef typename { } <> () FOO_MAGIC_1
// и прочих радостей поддержки чужого кода

Более известный пример
В бусте тоже есть полезные макросы, особенно в сочетании с другой чёрной магией
Ответ написан
opium
@opium
Просто люблю качественно работать
я не использую
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы