Столкновение двух библиотек. Неоднозначные функции/переменные?

Я получаю несколько ошибок при попытке включить эти две библиотеки:

ошибка: ожидается неполный идентификатор перед токеном '{' #define DEBUG_PRINTLN(...) {}

#include <DHT.h>
#include <DGS.h>

void setup() {
}

void loop() {
}

Очевидно, DEBUG_PRINTLN вызывает проблемы, потому что он определен как частная функция в DGS.h и как константа (#define) в DHT.h.

Включение DGS.h перед DHT.h не вызывает ошибок. Но это безопасный обходной путь или я могу столкнуться с ошибками позже? Как я могу справиться с этим, не изменяя библиотеки?

DGS.h:

/*
DGS_25SEP17.h — библиотека для чтения KWJ Engineering с датчиками SPEC на Digital SDK с датой прошивки 25SEP17.
Создано Дэвидом Э. Пизли, 29 марта 2018 г.
*/

#ifndef _DGS_h
#define _DGS_h

#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#elif defined(SPARK)
//#включаем "application.h"
#else
#include "WProgram.h"
#endif

#include "Stream.h"

class DGS
{
  private:
    Stream *_mySerial;
    long dataArray[11]; //Универсальный массив
    //пустая разблокировка(пустая);
    void DEBUG_PRINTLN(long x);
    void DEBUG_PRINTLN(float x);
    void DEBUG_PRINTLN(String x);
    void DEBUG_PRINT(long x);
    void DEBUG_PRINT(float x);
    void DEBUG_PRINT(String x);

  public:
    DGS(Stream &mySerial); //Класс, представляющий DULP с Stream как класс для Serial
    DGS(Stream *mySerial); //Класс, представляющий DULP с Stream как класс для Serial

    bool DEBUG;

    int setToff(float offset);  //Устанавливает смещение температуры
    int setBC(String BC);  // Инициализирует DGS со всей информацией из штрих-кода, единственный способ установить Span
    String getFW(void); //Возвращает дату прошивки

    int getLMP(void); //Загружает LMP[3] со значениями регистров из LMP91000
    int LMP[3];  //Регистры LMP, должны быть загружены с помощью getLMP
    int setLMP(int R1, int R2, int R3); //Устанавливает новые регистры LMP и повторно инициализирует LMP

    int zero(void); //Обнуление текущих показаний, обнуление только в среде с чистым воздухом
    int setXSpan(float); //Повторная калибровка устройства, следует использовать только после нуля и с использованием калиброванного газа

    int getData(char c); // Получает данные и загружает в переменные
    long getConc(char x = 'p');  //Читает концентрацию из текущего массива данных 'p' ppb или 'c' отсчетов
    long getTemp(char t = 'C');  //Считывает температуру из текущего массива данных 'C' для градусов Цельсия или 'F' для градусов Фаренгейта
    long getRh(char r = 'r'); //Читает Rh из текущего массива данных 'r' для Rh и 'c' для счетчиков

    void getEEPROM(void); //Загружает переменные в массивы EEPROM E[5] и e[14], выводит EEPROM, если DEBUG имеет значение true
    String eepromStr[5]; // Сохраняет символьные данные EEPROM
    long eepromInt[13];  // Сохраняет целочисленные данные EEPROM
    float Sensitivity_Code;  //Сохранение коэффициента чувствительности в нА/млн.
};

#endif

DHT.h:

/* библиотека DHT

лицензия Массачусетского технологического института
написано Adafruit Industries
*/
#ifndef DHT_H
#define DHT_H

#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif


// Раскомментируйте, чтобы разрешить вывод хороших отладочных сообщений.
//#определить DHT_DEBUG

// Определяем, где будут напечатаны отладочные данные.
#define DEBUG_PRINTER Serial

// Настройка макросов отладочной печати.
#ifdef DHT_DEBUG
  #define DEBUG_PRINT(...) { DEBUG_PRINTER.print(__VA_ARGS__); }
  #define DEBUG_PRINTLN(...) { DEBUG_PRINTER.println(__VA_ARGS__); }
#else
  #define DEBUG_PRINT(...) {}
  #define DEBUG_PRINTLN(...) {}
#endif

// Определяем типы датчиков.
#define DHT11 11
#define DHT12 12
#define DHT22 22
#define DHT21 21
#define AM2301 21


class DHT {
  public:
   DHT(uint8_t pin, uint8_t type, uint8_t count=6);
   void begin(uint8_t usec=55);
   float readTemperature(bool S=false, bool force=false);
   float convertCtoF(float);
   float convertFtoC(float);
   float computeHeatIndex(bool isFahrenheit=true);
   float computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit=true);
   float readHumidity(bool force=false);
   bool read(bool force=false);

 private:
  uint8_t data[5];
  uint8_t _pin, _type;
  #ifdef __AVR
    // Используйте прямой доступ к GPIO на 8-битном AVR, поэтому следите за портом и битовой маской
    // для цифрового вывода, подключенного к DHT. Другие платформы будут использовать digitalRead.
    uint8_t _bit, _port;
  #endif
  uint32_t _lastreadtime, _maxcycles;
  bool _lastresult;
  uint8_t pullTime; // Время (в мкс) для извлечения строки данных перед чтением

  uint32_t expectPulse(bool level);

};

class InterruptLock {
  public:
   InterruptLock() {
#if !defined(ARDUINO_ARCH_NRF52)  
    noInterrupts();
#endif
   }
   ~InterruptLock() {
#if !defined(ARDUINO_ARCH_NRF52)  
    interrupts();
#endif
   }
};

#endif

, 👍2


1 ответ


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

3

Функции DEBUG_ в классе DGS являются частными и используются только в DGS.cpp. Они не будут конфликтовать с макросами из DHT.h

Если DHT.h включен перед DGS.h, препроцессор заменяет имена функций DEBUG_ содержимым макросов из DHT.h, и результат не имеет смысла для компилятора.

Вы можете выполнить #undef DEBUG_PRINT и #undef DEBUG_PRINTLN после DHT.h, чтобы отменить определение макросов для остальной части скетча. DHT.cpp включает DHT.h и содержит определенные макросы.

,

Спасибо! Я предполагаю, что под «GBS» вы имеете в виду «DGS»?, @wheeler