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-переменную — найдите это место и пересмотрите логику.

Полезные материалы