Создание массива с длиной, полученной из библиотеки

При создании массива, как в скетче

#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.

Есть ли какой-либо способ инициализировать массив в скетче, чтобы его длина исходила из библиотеки, сохраняя при этом надлежащий дизайн библиотеки?

, 👍0

Обсуждение

Заголовочные файлы предназначены для определения того, что используется библиотечными функциями, а также потребительским кодом. Итак, если обоим нужен доступ к переменной длины, почему определение длины в заголовочном файле должно быть неправильным дизайном библиотеки? Например, вся информация о регистрах MCU и сопоставлении их имен с номерами объявляется в заголовках., @Peter Paul Kiefer


1 ответ


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

0

Нет абсолютно ничего плохого в том, чтобы поместить его в заголовок.

§9.4.2/4 Если статический элемент данных имеет константный интегральный тип или константный тип перечисления, его объявление в определении класса может указывать инициализатор константы, который должен быть интегральным константным выражением (5.19). В этом случае член может появляться в целочисленных константных выражениях. Член по-прежнему должен быть определен в области пространства имен, если он используется в программе, и определение области пространства имен не должно содержать инициализатор.

Поскольку вы просто используете его как простое постоянное "интегральное" значение, нет ничего плохого в том, чтобы поместить его в заголовок.

,

Итак, ответ: «Просто сделайте это так, даже если инициализация не в файле .cpp, как и во всем остальном»? Или есть другой способ?, @LukasFun

Ответ: «Просто сделайте это так, потому что это правильный способ сделать это, поскольку у вас есть статический интегральный тип const»., @Majenko

@LukasFun Вы можете определить константу в заголовке и использовать ее для инициализации статического члена в файле cpp. Вы также можете использовать эту константу в скетче во время компиляции. Но это было бы худшим решением (по крайней мере, ИМХО)., @Peter Paul Kiefer