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