внешний #define для библиотеки

Тема в разделе "Arduino & Shields", создана пользователем Vovka, 15 янв 2019.

  1. parovoZZ

    parovoZZ Гуру

    Под массив память выделяется абсолютно стандартными средствами. Маллок нафига? Там кто-то ещё претендует на эту память?
     
  2. AlexU

    AlexU Гуру

    У компилятора avr-gcc есть такой параметр '-D', который позволяет задать значение макроса. Вот только беда -- Ардуино IDE -- не позволяет простым образом конфигурировать параметры компиляции.
    Такие определения в заголовочном файле лучше не делать.
     
  3. SergeiL

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

    Ну, да Вас сложно понять, или Вы не понимаете. :)
    Не новость :)
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Это наезд? Ну-ну :)))
     
  5. SergeiL

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

    Это констатация фактов. :)
    Ну, что можно подумать, если человек с кукишом на аватарке постоянно спрашивает про понимание ? :)
    Его отношение к окружающим сразу понятно ;)
     
  6. Daniil

    Daniil Гуру

    malloc как пример.
    Как я понял, до написания (обдумывания) программы размер массива неизвестен = динамический массив => выделение памяти ручками.
     
  7. mcureenab

    mcureenab Гуру

    Чтобы макроподстановка была видна в теле объектов библиотеки, нужно поместить эти объекты (переменные, функции и т.п.) в h файл. Естественно, все эти объекты будут компилироваться при каждой сборке проекта.

    В c++ вместо макросов лучше использовать template (шаблоны). Но вариативный код шаблонов так же нужно помещать в h файл.

    Чтобы в теле библиотеки абстрагироваться от значения макроса (что позволит собрать объектный файл библиотеки не имея значение макроса), можно в коде библиотеки использовать внешнюю (external) переменную, которую объявить и инициализировать в заголовке программы пользователя вместе с прочими типами и переменными.

    Код (C++):
    // my_lib.h

    const size_t ar_size = AR_LEN;
    int ar[ar_size];
    Код (C++):
    // my_lib.cpp
    // тут не должно быть my_lib.h потому как в нём фактически выделяется память под переменные

    extern const size_t ar_size;
    extern int ar[]; // Мы не знаем размер и расположение ar

    int f(size_t i)
    {
       if(i < ar_size) return ar[i];
        return 0;
    }

     
    Фактически, для компиляции объектного файла библиотеки можно использовать h файл, который может отличается от h файла, который поставляется конечному пользователю. Но тут разработчик библиотеки должен понимать что делает.
     
    Последнее редактирование: 16 янв 2019
  8. Asper Daffy

    Asper Daffy Иксперд

    Это главная проблема этого топика (да и форума :))
     
    DetSimen нравится это.
  9. mcureenab

    mcureenab Гуру

    Использование в библиотеках статических объектов должно быть минимальным.
    Ваша библиотека может использоваться, например, только в функции setup, а ценную память будет занимать постоянно.