Создание массива с длиной, полученной из библиотеки
При создании массива, как в скетче
#include <Lib.h>
int myArray[Lib::len];
void setup() {}
void loop() {}
переменная len должна быть целочисленной константой, известной во время компиляции. Как показано в разделе, я хочу поместить длину массива в библиотеку и получить ее оттуда. Проблема в том, что для того, чтобы это работало, вы должны инициализировать константу уже в файле .h, что противоречит стандартам библиотеки. Вот как вы это сделаете (.h файл библиотеки):
class Lib {
public:
static const int len = 4;
};
В этом случае файл .cpp может вообще ничего не содержать. Однако правильный способ делать что-то в библиотеке будет таким:
Файл .h:
class Lib {
public:
static const int len;
};
Файл .cpp:
#include "Lib.h"
const int Lib::num = 4;
Но если сделать так, len
не будет иметь значения во время компиляции, поскольку скетч включает только файл .h, а не файл .cpp.
Есть ли какой-либо способ инициализировать массив в скетче, чтобы его длина исходила из библиотеки, сохраняя при этом надлежащий дизайн библиотеки?
@LukasFun, 👍0
Обсуждение1 ответ
Лучший ответ:
Нет абсолютно ничего плохого в том, чтобы поместить его в заголовок.
§9.4.2/4 Если статический элемент данных имеет константный интегральный тип или константный тип перечисления, его объявление в определении класса может указывать инициализатор константы, который должен быть интегральным константным выражением (5.19). В этом случае член может появляться в целочисленных константных выражениях. Член по-прежнему должен быть определен в области пространства имен, если он используется в программе, и определение области пространства имен не должно содержать инициализатор.
Поскольку вы просто используете его как простое постоянное "интегральное" значение, нет ничего плохого в том, чтобы поместить его в заголовок.
Итак, ответ: «Просто сделайте это так, даже если инициализация не в файле .cpp, как и во всем остальном»? Или есть другой способ?, @LukasFun
Ответ: «Просто сделайте это так, потому что это правильный способ сделать это, поскольку у вас есть статический интегральный тип const»., @Majenko
@LukasFun Вы можете определить константу в заголовке и использовать ее для инициализации статического члена в файле cpp. Вы также можете использовать эту константу в скетче во время компиляции. Но это было бы худшим решением (по крайней мере, ИМХО)., @Peter Paul Kiefer
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Как масштабировать растровое изображение (массив uint8_t) в Arduino?
- Глобальные переменные занимают много места в динамической памяти.
- Включить Guards vs #pragma один раз
- Объявление и использование массива структур в Arduino
- Ошибка: function was not declared in this scope when using a library without classes
- Поддерживает ли Arduino C++ динамические массивы объектов ?
Заголовочные файлы предназначены для определения того, что используется библиотечными функциями, а также потребительским кодом. Итак, если обоим нужен доступ к переменной длины, почему определение длины в заголовочном файле должно быть неправильным дизайном библиотеки? Например, вся информация о регистрах MCU и сопоставлении их имен с номерами объявляется в заголовках., @Peter Paul Kiefer