const
Квалификатор const делает переменную константой: после инициализации её значение нельзя изменить — компилятор выдаст ошибку при любой попытке перезаписи.
Полная статья
Описание
const — это квалификатор, который превращает переменную в константу: после инициализации её значение нельзя изменить. Попытка присвоить ей новое значение в любом месте программы вызовет ошибку компиляции — компилятор защитит вас от случайной перезаписи важного параметра.
const float pi = 3.14;
float x;
// ....
x = pi * 2; // константы можно использовать в математических выражениях
pi = 7; // ошибка — нельзя записывать (изменять) константу
Объявляйте через const всё, что не должно меняться в ходе работы скетча: номера пинов, пороговые значения, коэффициенты пересчёта, задержки, адреса устройств. В отличие от #define, константа, объявленная через const, имеет конкретный тип данных и подчиняется правилам области видимости — она «видна» только там, где объявлена, и не засоряет глобальное пространство имён.
#define или const
Оба способа позволяют задать именованную константу, но между ними есть принципиальная разница. const — это директива препроцессора: перед компиляцией он просто подставляет текст вместо имени, без какого-либо типа и без проверки. const работает иначе:
- у константы есть тип — компилятор проверяет совместимость при использовании;
- ошибки типов обнаруживаются на этапе компиляции, а не во время выполнения;
- константа соблюдает область видимости — её можно объявить внутри функции или блока;
- код становится понятнее: сразу видно, что это за значение и какого оно типа.
Для именованных числовых и строковых констант в Arduino-скетчах const — предпочтительный выбор. Исключение: массивы констант. Для них используйте const, поскольку #define не позволяет объявить массив как константу в том же синтаксисе.
Практические замечания
- Если значение не должно меняться — объявляйте его через
constсразу при написании кода. Это документирует намерение и защищает от случайных ошибок. - Для номера пина отлично подходит
const byte ledPin = 13;: типbyteэкономит память, аconstгарантирует, что пин не будет случайно переназначен. constразмещает константу в оперативной памяти (SRAM) по умолчанию — это не то же самое, что хранение во flash-памяти. Если у вас большие таблицы данных или строки, которые нужно хранить во flash на AVR-платах (Uno, Mega и др.), используйтеPROGMEM.- Константы с
constучаствуют в оптимизации компилятора: он может подставить значение напрямую в код, не выделяя для него ячейку в SRAM — особенно это важно на платах с ограниченной памятью. - Если при компиляции появляется ошибка вроде
assignment of read-only variable, значит где-то в коде есть попытка изменитьconst-переменную — найдите это место и пересмотрите логику.