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

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

  1. Vovka

    Vovka Гик

    Допустим скетче пишем:
    Код (C++):
    #define AR_LEN 10

    #include "my_lib.h"

    ....
    Файл "my_lib.h" - этот файл лежит в каталоге библиотек и в нем такое определение:
    Код (C++):
    int ar[AR_LEN];
    ...
    Как заставить, чтобы компилятор видел "внешнее" определение AR_LEN?
    Копировать файлы библиотеки в каталог скетча и перенос определения в файл "my_lib.h" не выход
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Ну, во-первых, если он "лежит в каталоге библиотек", то напишите имя файла в угловых скобках.

    А во-вторых, он и так видит в Вашем файле ( том, где этот "include"). А вот в тех файлах, которые тоже включают этот my_lib.h (например. в библиотечном файле my_lib.cpp) - не видит.

    Сделать, чтобы и в тех файлах видел без корректировок библиотечных файлов - никак.
     
    DetSimen нравится это.
  3. Vovka

    Vovka Гик

    Опечатался ;)

    А в my_lib.h можно как-то сделать "переопределение", чтобы стало видно в my_lib.cpp?

    А есть ли какое-то системное определение, в котором полный путь к каталогу моего проекта?

    Или перед запуском компиляции запустить внешнюю программу? Такое есть, например, в Visual C++, MPLAB IDE...
     
    Последнее редактирование: 15 янв 2019
  4. b707

    b707 Гуру

    добавьте свой #define в начало my_lib.h - и все получится...
    А все. что вы пишете в скетче - видно только в скетче и никуда дальше не идет.
    неправильно. Так. как написано в первом сообщении - #define виден только в скетче. а в my_lib.h и любых других файлах - не виден.
     
  5. Vovka

    Vovka Гик

    Я ж писал:
    Только что проверил, компилируется без ошибок:
    Код (C++):
    #define AR_LEN 10
    #include <my_lib.h>

    void setup() {
      ar[9] = 55;
    }
    void loop() {
    }
    и сам файл "my_lib.h":
    Код (C++):
    int ar[AR_LEN];
     
  6. parovoZZ

    parovoZZ Гуру

    обозначает, что все содержимое файла на этапе компиляции будет помещено в целевой файл.
     
  7. b707

    b707 Гуру

    это совершенно не означает. что ваш дефайн встроился в файл my_lib.h
    Добавьте работу с массивом ar[] в файл my.lib.cpp - перестанет компилироваться.
     
  8. b707

    b707 Гуру

    'на самом деле это единственный правильный выход, все остальное в любой момент может перестать работать.
     
  9. Vovka

    Vovka Гик

    Встроился:
    Код (C++):
    void setup() {
      ar[9] = 55;
    }
    Вот с этим как раз и проблема :(

    Может все таки есть у компилятора глобальное определение каталога проекта? Чтоб в my_lib.cpp написать:
    Код (C++):

    #include "PRJ_DIR\my_defines.h"
    #include "my_lib.h"
     
    а в каталоге проекта, в файле my_defines.h прописать #define AR_LEN 10
     
  10. parovoZZ

    parovoZZ Гуру

    для этого в my.lib.cpp необходимо написать
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Вы меня удивляете. Дефайн расположен выше include, значит во включаемом файле он безусловно виден. Но именно в этом включении. проверьте и убедитесь.
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Нет
    Вы забыли сказать, какой именно компилятор используете, а потому вопрос в пустоту.
     
  13. b707

    b707 Гуру

    если б встроился - у вас бы не было проблем с файлом my_lib.cpp
    Именно потому. что ваш дефайн работает только в скетче и никуда не встроися - у вас и есть проблемы.
     
  14. b707

    b707 Гуру

    "Дефайн виден только в этом включении" - с такой редакцией согласен :)
    Я правда не считаю, что это дает право говорить. что дефайн "включился в файл my_lib.h" - имхо, это означало бы. что дефайн теперь виден во всех файлах. где есть #include "my_lib.h" - а это ведь не так, вы ж не станете спорить? :)
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Вы процитировали меня (а не ТС), но либо не прочитали, либо не поняли.

    Я писал, my_lib.h включаемый в скетче, всё видит и в нём этот дефайн вполне себе определён, всё с ним в порядке, а вот когда тот же my_lib.h включается из другого файла (типа my_lib.cpp) то там разумеется этого дефайна нет. Вот точная цитата
    Вы зачем-то спорите с этим очевидным фактом, и запутываете ТС ещё больше.
     
  16. Asper Daffy

    Asper Daffy Иксперд

    А я где-то так говорил? Вы меня с кем-то явно перепутали
     
  17. Vovka

    Vovka Гик

    По умолчанию который идет с "Arduino Software (IDE)". А как он там называется в настройках среды ничего по нему нет. Плата "Arduino Mini".
     
  18. b707

    b707 Гуру

    я уже понял, что мы с вами понимаем процесс включения одинаково. но описываем по разному :) предлагаю на этом закончить :)
     
  19. Daniil

    Daniil Гуру

    А нельзя ли это сделать через маллок. В библиотеке написать процедуру инициализации массива, а в скетче, кроме объявления дефайна еще вызвать процедуру и всё.
    Да, маллок на мк не советуют, но мы не будем играть с памятью, а, просто, 1 раз выделим память под массив.
     
  20. Vovka

    Vovka Гик

    так как раз и цель - избавиться от одноразового выделения памяти - лишний код, съедающий память...