ОБСУЖДЕНИЕ

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

11 ответов 7,1 тыс.
AI-выжимка обсуждения скоро

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

Автор темы
Узнал буквально на днях из статьи про директиву препроцессора define, что ее можно использовать так же как и функцию. Т.е. что-то в этом роде:
Код:
#define Ploshad (b) (b*b)
Ведь это ж проще и нагляднее, чем писать функцию. Все умещается в одну строчку и уменьшает написание кода. Так в чем проблема макроса define, что его ни кто не использует?
 
Вызовите Ploshad(2+2) и посмотрите что получится
 
European -Это легко лечится скобками) Имхо. не в том дело)
 
Ну, во-первый, топик стартер де-факто, предлагает использовать макросы вместо функций - хотел бы я посмотреть на макрос который заменяет функцию хотя бы из 10 строчек(линейную, без циклов и т.п.) Сразу пропадет все удобство) К тому же, из-за особенности их вычисления - их напряжно и писать, (нужно) (о) (многом) (помнить)=). А потому, имхо, пользовать их стоит именно тогда, когда нужно много раз делать вычисления именно такого типа - как в первом посте. Для чего-то более сложного - муторно.
 
1. Макросы подставляются при каждом своем вызове, так что если вызовов много - объем кода будет немного больше, чем при вызове не встроенных функций.
2. Кроме того макрос не задает тип параметров - что может привести к ошибкам при его использовании (хотя иногда это и повышает универсальность).
3. Функцию тоже можно написать в одну строчку.
4. Попробуйте организовать рекурсию макросов.
5. И наконец (если не ошибаюсь) макросы подставляются в код, изменяя номера строк. Что затрудняет отладку программы.
 
Хотелось бы добавить к сказанному что существуют inline функции, я бы рекомендовал использовать их а не define потому что код намного элегантнее, и совпадает с тем который бы генерировался с помощью define.

P.S.: Учите asm, поймёте всё. Си + asm - мощная связка для понимания программирования и почему всё именно так.
 
Ну, во-первый, топик стартер де-факто, предлагает использовать макросы вместо функций - хотел бы я посмотреть на макрос который заменяет функцию хотя бы из 10 строчек(линейную, без циклов и т.п.) Сразу пропадет все удобство) К тому же, из-за особенности их вычисления - их напряжно и писать, (нужно) (о) (многом) (помнить)=). А потому, имхо, пользовать их стоит именно тогда, когда нужно много раз делать вычисления именно такого типа - как в первом посте. Для чего-то более сложного - муторно.
смотри код GStreamer какой-нибудь демультиплексер
 
Использовать #define для определения "функций" типа той же Ploshad(:( не рекомендуется именно потому, что код этой "функции" вставляется "как есть". В результате вызов такой "функции" вроде
C++:
Ploshad(x++)
даст совсем не то, что надо. И скобки
C++:
#define Ploshad(b) ((b)*(b))
тут не помогут.
 
Программировать надо на Си, а не на препроцессоре ))))

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


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

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