Не получается использовать String в Namespace.h. Библиотека с файлом настроек.

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

Не получается использовать String в Namespace.h.  Вопрос к знатокам.

Пытаюсь делать отдельный файл, в котором будут переменные, включая массив строк. Доступ к переменным нужен из библиотеки, к enum как из библиотеки так и из основного кода main.ino. Однако именно String не компилируется ругаясь на множественное объявление.

main.ino

#include "Namespace.h"
using namespace ns;
#include "my_class.h"
my_class one(appl);
void setup(){}
void loop(){}

my_class.h

#ifndef my_class_h
#define my_class_h
class my_class{
public:
  my_class  (uint8_t val);
  a my_struct;
};
#endif

my_class.cpp

#include <Arduino.h>
#include "Namespace.h"
using namespace ns;
#include "my_class.h"
 my_class:: my_class (uint8_t val)
 {
   my_struct.b = pen;
 }

Namespace.h

#ifndef NS__
#define NS__
#include <Arduino.h>
namespace ns{
    struct a {uint8_t b;};
    enum c{appl, pen};
    String d; //Стоит закомментировать и все собирается
}
#endif

Лог компиляции:

my_class.cpp.o (symbol from plugin): In function `ns::d':
(.text+0x0): multiple definition of `ns::d'
.pio\build\nanoatmega328\src\main.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\nanoatmega328\firmware.elf] Error 1

Делаю переменные в файл так как библиотека состоит из двух классов. В каждом классе не должно быть путаницы с переменными и названиями enum.

rkit
Offline
Зарегистрирован: 23.11.2016

Не объявление, а определение. Разберись в разнице между этими двумя вещами - вопрос закроется.

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

rkit, благодарю. Получилось. Однако файл пришлось разделить на два.

extern String d; в h файле и

String d = "Hallo"; в одноименном cpp файле.