Руководство по созданию библиотеки

library cpp

Согласно этому примеру создание библиотеки Arduino вполне понятно.

Но я хотел бы задать несколько вопросов (в основном относительно того, что и где определять), когда библиотека не так проста:

  1. Где разместить дополнительные библиотеки (например, <Wifi.h>) в .h или .cpp, поскольку это работает, если определено в каждом из них?

  2. Какова цель определения переменных в разделе :private? Поскольку их можно определить внутри конструктора, и, насколько я знаю/проверял, это тоже работает.

  3. В файле .cpp имеет ли значение, когда экземпляры или переменные определены вне класса (в начале кода), поскольку, опять же, это работает одинаково?

, 👍1


3 ответа


Лучший ответ:

2

Где разместить дополнительные библиотеки (например, ) в .h или .cpp, поскольку они работают, если они определены в каждом из них?

Это не имеет большого значения, если части вашей библиотеки, которым необходимо видеть заголовки, могут их видеть. Лично я помещаю все заголовки в главный файл .h, а затем они включаются в файлы .cpp. Все это хранится в одном месте, и им легче управлять.

Какова цель определения переменных в разделе :private? Поскольку их можно определить внутри конструктора, и, насколько я знаю/проверял, это тоже работает.

Вам необходимо понимать понятие «объем». Определение переменной внутри конструктора означает, что она доступна только внутри этого конструктора. Это «локальная» область действия. Определение переменной в классе в разделе «private» делает эту переменную доступной для каждой функции внутри класса. Размещение его в «публичном доступе» делает его доступным для всех и везде.

Имеет ли значение в файле .cpp, когда экземпляры или переменные определяются вне класса (в начале кода), поскольку, опять же, это работает одинаково?

Опять же, это вопрос «объема». Переменная, объявленная вне класса, находится в «глобальной» области. Существует только одна копия каждой из этих переменных, и все экземпляры класса используют одну и ту же физическую переменную. Это то же самое, что объявить переменную класса как «статическую» — она становится общей для всех экземпляров класса . Если данные, которые вам нужно сохранить, относятся к экземпляру класса (а это происходит в большинстве случаев), вы не хотите использовать глобальные переменные. В общем, использование глобальных переменных без необходимости является плохим тоном.

Кстати, вы можете увидеть переменные, определенные как в классе , так и в верхней части файла CPP. Это особый случай, когда в вашем классе есть статические переменные, которым не выделено никакого места для хранения (обычно место для хранения переменной выделяется при создании экземпляра класса, но со статическими переменными этого не происходит по понятным причинам), поэтому вам придется вручную предоставить место для хранения отдельной записью в файле CPP.

,

Большое спасибо. Теперь стало яснее. Что касается включения внешних библиотек в файл .h: насколько я понимаю, этот файл определяет только структуру класса, а не фактическое кодирование, верно? Если да, то почему я должен определять библиотеки в файле .h?, @Guy . D

Еще одна вещь: я не знал, что библиотека может содержать более одного класса, поэтому это более четко объясняет локаль переменных, но, насколько я понял, файл библиотеки и класс должны быть одинаковыми, не так ли?, @Guy . D

Заголовочный файл не является библиотекой. Это просто файл. Он включается дословно везде, где есть #include. Включение заголовочного файла библиотеки не дает вам код библиотеки, а только заголовок. Затем IDE должна найти файлы CPP и скомпилировать их. Имя файла заголовка не обязательно должно совпадать с именем класса. Это не похоже на Яву. В заголовочном файле вы можете иметь столько классов, сколько захотите. Или ничего, если вы того пожелаете., @Majenko


3
  1. Где разместить дополнительные библиотеки (например, <Wifi.h>) в .h или .cpp, поскольку они работают, когда определены в каждом из них?

Любая библиотека может ссылаться на любую другую библиотеку. Таким образом, включение другой библиотеки в вашу библиотеку — это то же самое, что и включение в скетч. Они должны находиться в стандартных местах.

Включите другие библиотеки .h в файл там, где они вам нужны. Если вы используете что-то из другой библиотеки в своем .h, включите это туда. Если вам это нужно только в .cpp, включите его туда.

  1. Какова цель определения переменных в разделе :private? Поскольку их можно определить внутри конструктора, и, насколько я знаю/проверял, это тоже работает.

Объявляя член класса как private, автор класса сообщает: не используйте его, он предназначен для внутреннего использования и может измениться в будущих версиях.

  1. В файле .cpp имеет ли значение, когда экземпляры или переменные определены вне класса (в начале кода), поскольку, опять же, это работает одинаково?

Если переменная не является членом класса, то если вы создадите два экземпляра класса, они будут использовать эту переменную совместно. Переменная в конструкторе ограничена областью действия конструктора .

,

спасибо, 1) а где его разместить? .h или .cpp? 2) основное значение слова «частный» я понимаю, но переменные (частные) также могут быть объявлены внутри файла «.cpp»... так в чем же разница?, @Guy . D

1) где следует разместить вашу библиотеку или библиотеки, которые она использует? используемые им библиотеки должны быть размещены так же, как и в Sketch. устанавливается с помощью менеджера библиотек или копируется в подпапку «Библиотеки» папки эскизов, @Juraj

2) как внутри .cpp?, @Juraj

1) Я знаю, куда поместить папку, содержащую файлы .cpp и .h. Мой вопрос заключается в том, где объявить использование определенной библиотеки (например, <Wifi.h>'), в .h или .cpp`., @Guy . D

1) вы используете его. больше ничего. пользователь вашей библиотеки должен установить их, @Juraj

Наверное, я не буду объяснять, скажем, что в своей библиотеке я хочу использовать внешнюю, установленную библиотеку (которая работает по мере необходимости в скетче). Теперь я хочу, чтобы он был объявлен в моей библиотеке, так где мне НАПИСАТЬ '#include <lib.h'? В файле «.h»? Или в файле .cpp?, @Guy . D

где вам это нужно. если вам это нужно только i cpp, поместите его туда. если оно тебе нужно в .h, помести его туда, @Juraj


1

Что касается 1: предпочитайте добавлять его только в файл Sketch/.cpp. Если это невозможно (поскольку вам нужно, чтобы класс был известен в файле заголовка, добавьте его в заголовок.

Причина: файл заголовка обычно включается во многие другие файлы, и добавление включения приводит к более связанному коду, что затрудняет последующее обслуживание.

Что касается 2/3: см. также мой несколько похожий ответ в why-to-store-a-function-parameter-value-in-a-class- частная переменная.

,