Variadic for макрос
Совместима со всеми Arduino платформами (используются Arduino-функции)
FOR_MACRO
- макрос, позволяющий применить другой макрос к variadic списку аргументов, по сути вызывает указанный макрос для каждого аргумента. По умолчанию поддерживает максимум 512 аргументов, можно сгенерировать макрос на любое количество аргументов при помощи приложенного python-скрипта.
Для использования макроса нужно создать два своих макроса - один будет макро-функцией, которая применяется к каждому аргументу, а вторая - сам макрос, который будет использоваться. Первая макро-функция должна иметь вид F(N, i, p, val)
, где:
N
- количество аргументовi
- счётчик, начинается с конца-1 из за особенностей реализацииp
- параметрval
- текущий аргумент
Сам FOR_MACRO
нужно вызвать со следующим списком аргументов в реализации своего макроса:
func
- объявленная ранее макро-функцияp
- параметр, может быть чем угодно. Можно поставить0
если не нужен__VA_ARGS__
- список аргументов (из многоточия)
Как это работает будет понятнее на примерах:
#define MF1(N, i, p, val) N,
#define FOR_1(...) FOR_MACRO(MF1, 0, __VA_ARGS__)
FOR_1(test, kek, string); // развернётся в 3, 3, 3,
#define MF2(N, i, p, val) i,
#define FOR_2(...) FOR_MACRO(MF2, 0, __VA_ARGS__)
FOR_2(test, kek, string); // развернётся в 2, 1, 0
#define MF3(N, i, p, val) p,
#define FOR_3(...) FOR_MACRO(MF3, 0, __VA_ARGS__)
FOR_3(test, kek, string); // развернётся в 0, 0, 0 (параметр)
#define MF4(N, i, p, val) val,
#define FOR_4(...) FOR_MACRO(MF4, 0, __VA_ARGS__)
FOR_4(test, kek, string); // развернётся в test, kek, string,
#define MF5(N, i, p, val) #val,
#define FOR_5(...) FOR_MACRO(MF5, 0, __VA_ARGS__)
FOR_5(test, kek, string); // развернётся в "test", "kek", "string",
Более реальный пример - создание строк
#define MF6(N, i, p, val) const char* p##_##i = #val;
#define FOR_6(name, ...) FOR_MACRO(MF6, name, __VA_ARGS__)
FOR_6(strings, test, kek, string);
// развернётся в
// const char* strings_2 = "test";
// const char* strings_1 = "kek";
// const char* strings_0 = "string";
#define MF7(N, i, p, val) const char* val = #val;
#define FOR_7(name, ...) FOR_MACRO(MF7, name, __VA_ARGS__)
FOR_7(strings, test, kek, string);
// развернётся в
// const char* test = "test";
// const char* kek = "kek";
// const char* string = "string";
- v1.0
- Библиотеку можно найти по названию FOR_MACRO и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
При нахождении багов создавайте Issue, а лучше сразу пишите на почту [email protected]
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код