ArduinoJson определить как extern

json

Мой скетч содержит 2 файла .h. один определяет

в файле 1st .h:

#define JSON_SIZE_IOT 400
#define JSON_SIZE_SKETCH 300
StaticJsonDocument<JSON_SIZE_IOT> paramJSON;
StaticJsonDocument<JSON_SIZE_SKETCH> sketchJSON;

а другим нужно определить paramJSON и sketchJSON как extern

в файле 2nd .h:

extern JsonDocument paramJSON;
extern JsonDocument paramJSON;

но я получаю эту ошибку:

error: conflicting declaration 'ArduinoJson6172_91::StaticJsonDocument<400u> paramJSON'
 StaticJsonDocument<JSON_SIZE_IOT> paramJSON;

....

: previous declaration as 'ArduinoJson6172_91::JsonDocument paramJSON'
 extern JsonDocument paramJSON;

, 👍0

Обсуждение

пожалуйста , посмотрите на фрагменты кода , которые вы опубликовали ... проблема , по - видимому , очевидна ... ошибка copy'n'paste снова поражает, @jsotola

@jsotola вы имеете в виду "JsonDocument" вместо "StaticJsonDocument`? это не работает в любом случае, @Guy . D

нет... вы сделали дубликат заявления, @jsotola

@jsotola См . Редактировать, какой фрагмент кода принадлежит какому файлу .h (если только я не понимаю, почему это дубликат), @Guy . D

не делайте определения переменных в файле h, который включен в несколько единиц перевода, @Juraj

@Juraj Я понимаю, что вы говорите, это можно сделать, но это очень не понятный способ. Значит ли это , что это невозможно сделать ?, @Guy . D

определение переменной всегда должно быть в cpp. in h, только если вы знаете, что делаете. но в to extern: он должен быть одного типа, включая типы шаблонов., @Juraj

@Juraj Спасибо. Мой файл .h суммирует каждую функциональность, используемую в sketch. Кстати, в моем случае нет .cpp, только ".ino" и ".h". Как бы вы это сделали, если бы существовал файл ".cpp"?, @Guy . D

затем поместите его в ino или добавьте файл cpp, @Juraj


1 ответ


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

1

Для extern все определение должно соответствовать определению "master".

Итак, если у вас есть:

StaticJsonDocument<JSON_SIZE_IOT> paramJSON;

тогда вы extern должен быть:

extern StaticJsonDocument<JSON_SIZE_IOT> paramJSON;

Конечно, вы должны убедиться, что ваш JSON_SIZE_IOT одинаков для обоих - так что лучше, если это происходит из общего источника.

Это известно как явное объявление экземпляра, и вы можете прочитать больше об этом в справочнике Class template C ++.

,

Разве "StaticJsonDocument" не является шаблоном? вот почему я использовал JsonDocument. Поскольку JSON_SIZE_IOT определен с помощью #define - как я могу его использовать? (препроцессор не передаст extern), @Guy . D

@Парень.D Вы не можете `перейти" к другому типу. Если вы хотите иметь что-то еще, то дайте себе указатель на него и сделайте приведение к этому предопределенному объекту., @Majenko