Столкновение двух библиотек. Неоднозначные функции/переменные?
Я получаю несколько ошибок при попытке включить эти две библиотеки:
ошибка: ожидается неполный идентификатор перед токеном '{' #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
@wheeler, 👍2
1 ответ
Лучший ответ:
Функции 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 и содержит определенные макросы.
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Ошибка: function was not declared in this scope when using a library without classes
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Ошибка компиляции ESP8266: "previous declaration of 'HTTPMethod HTTP_HEAD'"
- Ошибка компиляции библиотеки
- Библиотека не найдена при использовании команды arduino-cli (хотя работает с Arduino IDE)
- Добавить библиотеку в проект CLion
- Создание массива с длиной, полученной из библиотеки
Спасибо! Я предполагаю, что под «GBS» вы имеете в виду «DGS»?, @wheeler