Skip to content

GyverLibs/FOR_MACRO

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

latest PIO Foo Foo Foo

Foo

FOR_MACRO

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
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

About

Variadic for макрос

Resources

License

Stars

Watchers

Forks

Packages

No packages published