Почему? Обычно я использую глобальные настройки только в main.cpp (включаю только в один файл кода) и передаю необходимые параметры конструктору класса при создании экземпляра.
Но: Я работаю с PlatformIO, ESP32-S3 и в своем приложении с TFT_eSPI (дисплей ST7796), LVGL и сенсорная библиотека TAMC_GT911.
Из-за сложности мне пока не удалось упаковать все это в классы. Поэтому я отложил решение проблемы на будущее. Чтобы привести в порядок файл main.cpp, я создал файл заголовка и файл кода для реализации, связанной с отображением (
Код: Выделить всё
DispFunc.h
Итак, теперь мне нужно сделать глобальные настройки доступными и в DispFunc.cpp и, таким образом, включить SETTINGS.h на секунду время. Мой подход работает, но уже не так хорош.
Мое требование: Все определения хранятся исключительно в файле настроек (
Код: Выделить всё
SETTINGS.cpp). Не в обоих: .h
Подход с двумерным массивом: Это работает с этой структурой. Однако файл заголовка содержит определения (в определенной степени), которые я не хочу иметь там.
Код: Выделить всё
SETTINGS.h
Код: Выделить всё
enum pubTopicNameEnum
{
mqttPubStatus,
mqttPubTemperature,
mqttPubLight
//...
};
extern char pubTopicChar[][256];
Код: Выделить всё
SETTINGS.cpp
Код: Выделить всё
const int nPub = 3; // Total number of Topics to Publish
const int l = 256; // Maximum number of characters for topic name (minus 1)
char pubTopicChar[nPub]\[l] =
{
"/stat/Status",
"/stat/Temperature",
"/stat/Light"
};
Код: Выделить всё
main.cpp
Код: Выделить всё
#include
//...
Serial.println(pubTopicChar[mqttPubStatus]);
Код: Выделить всё
others.cpp
Код: Выделить всё
#include
1. Недостаток перечисления: мне нужно определить тип перечисления в SETTINGS.h (не .cpp), чтобы у меня был доступ к нему в файлах кода, которые включают SETTINGS.h. Такое объявление, как extern enum themeNamePub, невозможно.
2. недостаток перечисления: мне нужно знать количество объектов перечисления для определения моего массива символов в SETTINGS.cpp. И в настоящее время я не знаю, как оценить количество определенных объектов перечисления, и мне приходится определять это число дополнительно (см. SETTINGS.cpp).
3. Недостаток char-Array: мне нужно указать второе измерение (длину записи массива символов, то есть имени темы) уже в SETTINGS.h. Однако это должно быть определено только в SETTINGS.cpp.
Подход с использованием массива структур: Поэтому мне нужен только одномерный массив, состоящий из нескольких определений структур. Единственным элементом структуры является массив символов с названием темы.
Код: Выделить всё
SETTINGS.h
Код: Выделить всё
struct PubTopicStruct;
extern PubTopicStruct pubTopicStruct[];
Код: Выделить всё
SETTINGS.cpp
Код: Выделить всё
const int l = 256;
struct PubTopicStruct
{
char topic[l];
};
struct PubTopicStruct pubTopicStruct[] =
{
{ "/stat/Status" },
{ "/stat/Temperatur" },
{ "/stat/Light" }
};
Код: Выделить всё
others.cpp
Код: Выделить всё
#include
Код: Выделить всё
main.cpp
Код: Выделить всё
#include
//...
Serial.println(pubTopicStruct[mqttPubStatus].topic);
2. Преимущество: Количество тем определяется определением массива с темами, мне больше не нужно указывать их заранее.
1. Недостаток: для доступа к конкретным именам перечислений в файлах кода определение перечисления все равно должно находиться в SETTINGS.h, а не в SETTINGS.cpp.
2. Недостаток: Я не совсем разбираюсь в указателях и ссылках. В Serial.println в main.cpp сообщение об ошибке компилятора для pubTopicStruct в этой строке гласит: выражение должно быть указателем на полный тип объекта . А для mqttPubStatus указано: недопустимое использование неполного типа 'struct PubTopicStruct'.
Вместо Enum я могу просто объявить 3 переменные int в .h и определите их в .cpp. Тем не менее, мне приходится добавлять в .h при добавлении темы, что не является общим и мне это не очень нужно. Решение всех остальных проблем может быть простым * ...
Подробнее здесь: https://stackoverflow.com/questions/793 ... -or-struct