Чем плоха директива Define?

  • Автор темы ertyuo
  • Дата начала
E

ertyuo

#1
Узнал буквально на днях из статьи про директиву препроцессора define, что ее можно использовать так же как и функцию. Т.е. что-то в этом роде:
Код:
#define Ploshad (b) (b*b)
Ведь это ж проще и нагляднее, чем писать функцию. Все умещается в одну строчку и уменьшает написание кода. Так в чем проблема макроса define, что его ни кто не использует?
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#4
European -Это легко лечится скобками) Имхо. не в том дело)
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#6
Ну, во-первый, топик стартер де-факто, предлагает использовать макросы вместо функций - хотел бы я посмотреть на макрос который заменяет функцию хотя бы из 10 строчек(линейную, без циклов и т.п.) Сразу пропадет все удобство) К тому же, из-за особенности их вычисления - их напряжно и писать, (нужно) (о) (многом) (помнить)=). А потому, имхо, пользовать их стоит именно тогда, когда нужно много раз делать вычисления именно такого типа - как в первом посте. Для чего-то более сложного - муторно.
 
I

IPavel

#7
1. Макросы подставляются при каждом своем вызове, так что если вызовов много - объем кода будет немного больше, чем при вызове не встроенных функций.
2. Кроме того макрос не задает тип параметров - что может привести к ошибкам при его использовании (хотя иногда это и повышает универсальность).
3. Функцию тоже можно написать в одну строчку.
4. Попробуйте организовать рекурсию макросов.
5. И наконец (если не ошибаюсь) макросы подставляются в код, изменяя номера строк. Что затрудняет отладку программы.
 
Y

Yerty

#8
Хотелось бы добавить к сказанному что существуют inline функции, я бы рекомендовал использовать их а не define потому что код намного элегантнее, и совпадает с тем который бы генерировался с помощью define.

P.S.: Учите asm, поймёте всё. Си + asm - мощная связка для понимания программирования и почему всё именно так.
 
A

alexsid

#9
Ну, во-первый, топик стартер де-факто, предлагает использовать макросы вместо функций - хотел бы я посмотреть на макрос который заменяет функцию хотя бы из 10 строчек(линейную, без циклов и т.п.) Сразу пропадет все удобство) К тому же, из-за особенности их вычисления - их напряжно и писать, (нужно) (о) (многом) (помнить)=). А потому, имхо, пользовать их стоит именно тогда, когда нужно много раз делать вычисления именно такого типа - как в первом посте. Для чего-то более сложного - муторно.
смотри код GStreamer какой-нибудь демультиплексер
 
T

Trupik

#10
Использовать #define для определения "функций" типа той же Ploshad:)( не рекомендуется именно потому, что код этой "функции" вставляется "как есть". В результате вызов такой "функции" вроде
C++:
Ploshad(x++)
даст совсем не то, что надо. И скобки
C++:
#define Ploshad(b) ((b)*(b))
тут не помогут.
 

v0id

New member
07.03.2008
2
0
#11
Программировать надо на Си, а не на препроцессоре ))))

Макросы использовать нужно с осторожностью и помнить обо всех возможных побочных эффектах, коих у них есть некоторое кол-во.


Достаточно хорошо это освещается в отделной главе книги
Правила программирования на Си и Си++
Ален И. Голуб

Советую к прочтению. Книга хоть и старая, но очень полезная!
В части С++ там есть некоторые уже не актуальные советы и утверждения....
 
A

Ambroyz

#12
Препроцессор хорошо использовать когда один проект собирается под разные оси. Поставил один вид сборки - компилишь под вин, другой под что-нибудь еще(предполагаются отсутсвие различий в логике работы). А макросы... они хороши лишь для убыстрения вызова ОЧЕНЬ мелких кусков программы, ни о каких больших функция не может быть речи, т.к. кроме вышеперечисленных причин еще очень замедляется работа программы из-за переключения страниц в памяти, длинных указателей и пр.