Как создать глобальный объект, доступный для src / кода, а также для библиотек lib /? - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь начать работу с PlatformIO и попал в стену с включенными приоритетами и / или переменными областями.

Мой код состоит из программы src/main.cpp, а также нескольких частных библиотек, которые находятся в папке lib/<libname>/*.cpp/h.

Я хочу иметь глобальный объект внешнего класса ( Syslog ), который будет доступен как для моей основной программы, так и для любых добавленных мной частных библиотек.

В настоящее время я пробовал 2 подхода, которые оба отказываются компилировать:


Создайте объект в main.cpp с ключевым словом extern, инициализируйте объект в setup() следующим образом:

ЦСИ / main.cpp:

#include <Syslog.h>
#include <WiFiUdp.h>
WiFiUDP SyslogUDP;
extern Syslog syslog;
void setup()
{
   syslog = Syslog(SyslogUDP, "255.255.255.255", 514, "FlyballETS", "FlyballETSApp", LOG_INFO, SYSLOG_PROTO_BSD);
}

Библиотека / GPSHandler / GPSHandler.cpp:

void GPSHandlerClass::init(HardwareSerial * SerialPort)
{
   syslog.logf_P("GPS Class initialized!");
}

Это приводит к ошибкам компилятора, таким как:

lib\GPSHandler\GPSHandler.cpp:22:4: error: 'syslog' was not declared in this scope

2-й подход, который я попробовал (это работает в Arduino IDE), создавал небольшой файл SyslogHelper.h, в котором создавался объект extern Syslog syslog;, а затем включал этот вспомогательный файл во все мои личные библиотеки, например:

SRC / main.cpp:

#include "SyslogHelper.h"
#include <WiFiUdp.h>
WiFiUDP SyslogUDP;

void setup()
{
   syslog = Syslog(SyslogUDP, "255.255.255.255", 514, "FlyballETS", "FlyballETSApp", LOG_INFO, SYSLOG_PROTO_BSD);
}

ЦСИ / SyslogHelper.h:

#include <Syslog.h>
extern Syslog syslog;

Библиотека / GPSHandler / GPSHandler.cpp:

#include "SyslogHelper.h"
void GPSHandlerClass::init(HardwareSerial * SerialPort)
{
   syslog.logf_P("GPS Class initialized!");
}

Когда я пытаюсь скомпилировать это в PlatformIO, происходит сбой, потому что в то время, когда он пытается скомпилировать SyslogHelper.h, он, похоже, не знает о местонахождении файла <Syslog.h>:

In file included from lib\GPSHandler\GPSHandler.cpp:7:0:
src/SyslogHelper.h:4:20: fatal error: Syslog.h: No such file or directory

1 Ответ

0 голосов
/ 12 января 2019

Хотя я понимаю, что вы говорите, что хотите, чтобы глобальный объект был разделен между библиотекой и вашими частными библиотеками, я собираюсь утверждать, что это не лучший шаблон проектирования, поскольку он хрупок и подвержен ошибкам (как вы испытываете). Лучший подход - передать объект SysLog, который вы создаете в своем основном коде, в качестве аргумента любому методу, который в этом нуждается. Причина в том, что это лучше, потому что вы явно объявляете, какие методы могут и должны использовать объект Syslog.

Однако, если вам действительно нужна глобальная переменная, вторым лучшим вариантом является использование класса доступа, который выглядит примерно так:

SysLogHelper.h

#ifndef __SysLogHelper_h__
#define __SysLogHelper_h__

#include <Syslog.h>

class SysLogHelper {
private:
    Syslog *_instance;

public:
    static Syslog& instance( void );

    Syslog();
    virtual ~Syslog()
}
#endif // __SysLogHelper_h__

SysLogHelper.cpp

#include "SysLogHelper.h"

SysLogHelper gSysLogHelper();

Syslog& SysLogHelper::instance( void ) {
    return gSysLogHelper._instance;
}

SysLogHelper::SysLogHelper() {
    _instance = Syslog(SyslogUDP, "255.255.255.255", 514, "FlyballETS", "FlyballETSApp", LOG_INFO, SYSLOG_PROTO_BSD);
}

SysLogHelper::~SysLogHelper() {
    delete _instance;
}

Затем в любом месте вашего кода вы хотите использовать объект SysLog, просто включите заголовок SysLogHelper.h и используйте свой экземпляр SysLog, вызывая статический метод, что-то вроде этого:

#include "SyslogHelper.h"
void GPSHandlerClass::init(HardwareSerial * SerialPort)
{
   SyslogHelper::instance().logf_P("GPS Class initialized!");
}

Не стесняйтесь переименовывать вещи по своему вкусу. Кроме того, с некоторой креативностью вы можете иметь более одного SysLog объекта в этом классе доступа, каждый из которых настроен по-разному.

...