Видимость #define

Тема в разделе "Arduino & Shields", создана пользователем sslobodyan, 12 фев 2017.

Метки:
  1. serg_admin

    serg_admin Гик

    Можно в хедере определить "сложный" макрос который определит массив нужного размера и передаст указатель на него в некую функцию инициализации библиотеки.
     
  2. sslobodyan

    sslobodyan Гик

    Unixon, спасибо, повеселили :)
    Проще перейти на взрослую систему разработки.
     
  3. sslobodyan

    sslobodyan Гик

    Покажите практическую реализацию на примере.
     
  4. mcureenab

    mcureenab Гуру

    Я бы сказал, что это проблема библиотеки, а не интерфейса. Ну не учли в ней такую хотелку.
     
  5. mcureenab

    mcureenab Гуру

    Для этого библиотека должна поддерживать такие выкрутасы. В данном случае библиотека объявляет статический массив внутри себя.

    Зачастую библиотеки поставляются в виде объектных файлов без исходника - заголовочный файл и скомпилированный код. Допустимые настройки делаются на этапе выполнения через вызовы функций.
     
  6. serg_admin

    serg_admin Гик

    Как я понял пишется своя либа или модифицируется существующая
    Готового кода под рукой нет (могу скинуть позже с рабочего кода правда для C). Пишу с головы могу где-то ошибится

    В *.h файл
    Код (C++):

    char *innerbuff;
    #define INIT(T)  static char buff[T]; \
               init (buff);

    void init(char* buff);
     
    В либе
    Код (C++):

    void init(char* buff) {
      innerbuff = buff;
    };
     
    В программе
    Код (C++):

    void setup()
    {
      INIT(64);
    }
     
    Фокус в том что главная программа определяет буфер сама в виде некой переменной (static подразумевает, что переменная будет существовать после завершения функции) потом этот буфер передается в либу. Можно передать и размер буфера.
     
    Последнее редактирование: 13 фев 2017
  7. Unixon

    Unixon Оракул Модератор

    Одно другого не отменяет :)
     
  8. Unixon

    Unixon Оракул Модератор

    Это не так. При сборке сколь-нибудь большого программного проекта из сторонних компонентов априори невозможно сделать так, чтобы все чужие библиотеки заранее знали ваши опции сборки или умели их в себя втягивать.

    Все эти пляски вокруг #define/#include - попытка модификацией кода нивелировать неумение штатной системы сборки декларировать препроцессору глобальные макросы.

    Наиболее нормальный вариант с Arduino IDE - использовать свой вариант платформы (клонировать стандартный variant, переписать boards.txt), в котором в самый верх инклудится какой-нибудь предопределенный файл из проекта/скетча, например "macros.h".
     
  9. mcureenab

    mcureenab Гуру

    http://playground.arduino.cc/Main/CustomizeArduinoIDE

    https://github.com/arduino/Arduino/...-specification#recipes-to-compile-source-code

    Думаю, сюда надо добавить опцию @file

    https://linux.die.net/man/1/avr-gcc

    где file - имя файла с опциями компиляции, в частности с опцией -DTEST_DEFINE. В каждом проекте должен быть свой такой файл.

    Не знаю пока, как вычислить значение file. Нужна переменная с путем к проекту. Или может быть это рабочий каталог. ХЗ....
    Еще не понятно, когда компилируются библиотеки.
     
  10. Unixon

    Unixon Оракул Модератор

    Каталог проекта передается в пути {includes}.