• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

ertyuo

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

European

Вызовите Ploshad(2+2) и посмотрите что получится
 
V

vital

European -Это легко лечится скобками) Имхо. не в том дело)
 
V

vital

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

IPavel

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

Yerty

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

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

alexsid

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

Trupik

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

v0id

Программировать надо на Си, а не на препроцессоре ))))

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


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

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

Ambroyz

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!