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как тип, который «сам разберётся с размером», и не думаете о нём специально — это и есть его главная ценность.