Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2012, 02:30   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию Использование макросов в C++ (+ и -)

Недавно наткнулся на такую фразу в интернете.
Цитировать не буду, полностью не помню, но звучит примерно так: Использовать макросы вредно, используйте в крайних случаях.

И у меня возник вопрос почему. Смотрел в интернете. Конкретного ответа на "почему" не нашел.

Вот и решил спросить у людей а не у гугла))).

Можно узнать о всех плюсах и минусах использования макросов. И как часто вы их используете. И каковы эдакие последствия частого использования макросов в программе.

Знаю один плюс:
1. Визуально сокращается объем кода (почему визуально думаю понятно)
И минус:
2. При использовании макросов, которые вычисляют сложные выражения, могут принести кучу проблем (думаю сами знаете какие)
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 16.08.2012 в 02:37.
kineziz вне форума Ответить с цитированием
Старый 16.08.2012, 02:52   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Макросы - лобовая подстановка значений аргументов вместо выражения. Отсюда у многих большие проблемы при их написании.
Код:
#define max(a,b) (a > b) ? a : b
Например, в таком варианте max(a | b,c) превратится в (a | b > c) ? a | b : c, причем из-за приоритета операций сравнение выполнится раньше побитового или, чего нам явно не надо. И даже если улучшить макрос
Код:
#define max(a,b) ((a) > (b)) ? (a) : (b)
остается еще одна проблема - если вместо аргумента стоит выражение, то оно будет вычислено дважды.

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

Многие случаи использования макросов можно заменить языковыми конструкциями (константы, inline-функции, классы, шаблоны), причем замена будет в разы безопаснее, так как о ней знает компилятор и он в силах сообщить нормальную информацию об ошибках.

Но, конечно, многие вещи пока без макросов сделать невозможно.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.08.2012, 02:58   #3
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Спасибо за содержательный ответ. Все понятно. А на производительности это никак да не сказывается?
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 16.08.2012, 03:11   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от kineziz Посмотреть сообщение
Спасибо за содержательный ответ. Все понятно. А на производительности это никак да не сказывается?
грубо говоря, это тупая подстановка в исходном коде, перед компиляцией.
Макросы модифицируют текст исходного кода. На производительность может повлиять только конечный текст исходного кода.

На мой взгляд, потенциально опасны только глобальные макросы.

Критерий "правильности" использования макроса можно сформулировать так:
1. Макрос не должен ухудшать читабельность кода сторонними лицами. А напротив - улучшать её. Если макрос не улучшает читабельность - он не нужен.

2. Макрос не должен быть глобальным, и создавать угрозу конфликтов тегов исходного кода. Его надлежит использовать только на коротких участках кода, и undef`ить сразу же, как только он становится не нужным.

3. Макросы не являются пользовательскими инструментами. И существуют только в недрах механизмов.

4. Макросы надлежит именовать с префиксами согласно принятой нотации, что бы избежать любых возможных конфликтов тегов исходного кода.

5. Идешки не умеют разворачивать макросы. Любые ошибки, которые происходят внутри макроса - сложно отлаживать. Это наиболее критичный фактор, который стоит учитывать, прежде чем будет принято решение использовать макрос.

Резюмируя: если есть возможность написать читабельный/сопровождаемый код без макросов - макросы не нужны.

Если использование макросов улучшит читабельность/сопровождаемость, и при это он будет запрятан в недрах механизмов - можно рассмотреть возможность его применения.

Последний раз редактировалось _Bers; 16.08.2012 в 03:13.
_Bers вне форума Ответить с цитированием
Старый 16.08.2012, 08:52   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Макросы нельзя "положить" в namespace
Макросы не различают типы данных
waleri вне форума Ответить с цитированием
Старый 16.08.2012, 14:52   #6
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Спасибо всем за ответы. Сделал выводы. Лучше ответов не найти
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение макросов Pilot Microsoft Office Excel 13 31.08.2010 18:05
Создание макросов Женечка2607 Microsoft Office Excel 3 23.04.2009 21:17
Автоматический запуск макросов с листа на котором указан перечень макросов с параметрами и без Neoli Microsoft Office Excel 2 09.03.2009 14:31
Сравнение макросов valerij Microsoft Office Excel 24 09.06.2008 00:57