size_t

Тип size_t — беззнаковый целый для хранения размеров объектов в байтах; именно его возвращают sizeof() и Serial.print(), и именно он избавляет от предупреждений компилятора.

Полная статья

Описание

size_t — беззнаковый целочисленный тип, предназначенный для хранения размеров объектов в байтах. Его ключевое свойство — гарантия того, что значение всегда помещается в допустимый диапазон: на любой платформе size_t достаточно широк, чтобы выразить размер самого большого объекта, который может существовать в памяти этой платформы. На большинстве плат Arduino это 16-битное беззнаковое целое (0–65535), но на платах с 32-битным процессором — 32-битное.

Вы редко объявляете переменные типа size_t вручную, однако постоянно сталкиваетесь с ним косвенно: именно этот тип возвращают sizeof() и Serial.print(). Когда вы сохраняете результат этих вызовов в переменную, правильнее всего использовать именно size_t, а не int — это избавляет от предупреждений компилятора и потенциальных ошибок при сравнении знаковых и беззнаковых значений.

Синтаксис

size_t var = val;

Параметры

  • var: имя переменной, в которую будет записано значение.
  • val: числовое значение, присваиваемое переменной. Как правило, это результат вызова функции, возвращающей size_t, например sizeof() или Serial.print().

Где применяется

  • Сохранение результата sizeof() — чтобы узнать, сколько байт занимает массив или структура, и использовать это значение в цикле.
  • Работа с буферами и строками — функции, принимающие длину буфера, часто ожидают аргумент типа size_t.
  • Написание собственных функций — если ваша функция возвращает количество байт или элементов, объявите возвращаемый тип как size_t: это согласуется с соглашениями стандартной библиотеки Arduino.

Практические замечания

  • Тип size_t всегда беззнаковый: сравнивать его со знаковым int нужно осторожно — компилятор может выдать предупреждение, а при значении -1 в int сравнение даст неожиданный результат.
  • Если вы используете size_t как счётчик в цикле for с убывающим счётчиком (i >= 0), цикл станет бесконечным: беззнаковое число никогда не станет отрицательным. В таких случаях лучше использовать обычный int или переписать условие.
  • На 8/16-битных платах (Uno, Nano, Mega) size_t — это uint16_t, на 32-битных (MKR, Due, ESP32-совместимых) — uint32_t. Код, который зависит от конкретного размера, лучше явно использует uint16_t или uint32_t.
  • В большинстве скетчей вы просто принимаете size_t как тип, который «сам разберётся с размером», и не думаете о нём специально — это и есть его главная ценность.

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