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

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

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

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

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

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


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

Еще из полезных свойств макросов - улучшать чужой плохой код. Если у вас есть много переменных, или переменных имена у которых почти совпадают с именами функций и вам нужно сделать этот код умнее, вы пользуетесь макросами, склеиваете строки через ## или преобразовываете переменную в строку через #
Это довольно мощные инструменты ( пусть до лисповских максросов им далеко ) которые реально позволяют улучшить код и/или избежать кучу повторений одного и того же блока кода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
niosus
@niosus
Макросы нужно использовать крайне редко. Единственное, что на мой взгляд можно отнести к плюсам макросов по отношению к инлайн функциям это их самый большой минус - отсутствие type safety. Например, чтобы переписать как функцию простой макрос
#define INC(x) (x + 1)
придется задействовать темплейты, если вам нужно, чтобы эта строчка работала не только с одним типом.

Однако, в абсолютном большинстве макросы не только не помогают но и сильно вредят.

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

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

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

Войти через центр авторизации
Похожие вопросы