Сила #define

Тема в разделе "Технологии радиолюбителя", создана пользователем CryNET, 26 мар 2015.

  1. CryNET

    CryNET Гик

    Всем привет!

    Приспичило мне в проекте на C++ считать значение определенного бита у переменной. На мое удивление, в плюсах нету готового решения на подобии bitRead() у ArduinoIDE, я тут же вспомнил где лежат .cpp и .h у этой среды. И тут мое представление о #define сломалось:
    Код (Text):
    #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
    Ранее я считал, что с помощью него можно тупо задавать переменные, и это от части так, но такой возможности как задавать мини-функции я не знал.
    Код на плюсах скомпилировался идеально, без ошибок и предупреждений.

    Может это кому-нибудь поможет в своих проектах...
     
  2. Kopilov

    Kopilov Гик

    Это называется "макрос" (команда для препроцессора -- программы, обрабатывающей код на текстовом уровне, до компиляции) -- осторожно с ними. В Arduino они более-менее оправданы, т.к. экономят память, дополнительный объём которой потребуется для хранения адресов настоящих функций и констант, а в проектах под мощную вычислительную технику такого лучше избегать.
     
    CryNET нравится это.
  3. Megakoteyka

    Megakoteyka Оракул Модератор

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

    Klimka Нуб

    Правильно ли я понимаю, коллеги, что приведенный пример кода заменяет 28 символов в тексте программы, где бы они не встретились, на 19 других символов и более ничего?
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Заменяет и подставляет параметры.