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

Тема в разделе "Общие вопросы по С и С++", создана пользователем ertyuo, 7 янв 2010.

  1. ertyuo

    ertyuo Гость

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

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    кто вам такое сказал?
    Просто вы не путайте макросы с функциями.. - это разные вещи
     
  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Вызовите Ploshad(2+2) и посмотрите что получится
     
  4. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    European -Это легко лечится скобками) Имхо. не в том дело)
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Твоя позиция не очевидна. Поясни...
     
  6. vital

    vital Больной Компом Детектед

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

    IPavel Гость

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

    Yerty Гость

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

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

    alexsid Гость

    смотри код GStreamer какой-нибудь демультиплексер
     
  10. Trupik

    Trupik Гость

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

    v0id New Member

    Регистрация:
    7 мар 2008
    Сообщения:
    2
    Симпатии:
    0
    Программировать надо на Си, а не на препроцессоре ))))

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


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

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

    Ambroyz Гость

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

Поделиться этой страницей