My sketch contains 2 .h files. one defines

on 1st .h file:

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

and other need to define paramJSON and sketchJSON as extern

on 2nd .h file:

extern JsonDocument paramJSON;
extern JsonDocument paramJSON;

but I get this error:

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


: previous declaration as 'ArduinoJson6172_91::JsonDocument paramJSON'
 extern JsonDocument paramJSON;
  • 1
    please look at the code snippets that you posted ... the problem appears to be obvious ... the copy'n'paste bug strikes again – jsotola Jan 10 at 0:26
  • @jsotola do you mean JsonDocument instead StaticJsonDocument? it does not work either way – Guy . D Jan 10 at 5:39
  • no ... you made a duplicate declaration – jsotola Jan 10 at 5:42
  • 1
    a variable definition should always be in cpp. in h only if you know what you are doing. but in to extern: it must be the same type including the template types. – Juraj Jan 10 at 13:16
  • 1
    then put it in ino or add a cpp file – Juraj Jan 10 at 13:32

For an extern the whole definition has to match the "master" definition.

So if you have:

StaticJsonDocument<JSON_SIZE_IOT> paramJSON;

then you extern has to be:

extern StaticJsonDocument<JSON_SIZE_IOT> paramJSON;

Of course you have to make sure your JSON_SIZE_IOT is the same for both - so it's best if that comes from a common source.

This is known as explicit instantiation declaration and you can read more about it in the Class template C++ reference.

  • Doesn't StaticJsonDocument a template ? that is why I used JsonDocument . Since JSON_SIZE_IOT defined using #define - how can I use it? ( pre-processor won't pass extern) – Guy . D Jan 11 at 12:16
  • @Guy.D You can't extern to a different type. If you want to have something else then give yourself a pointer to it and do a cast to that pre-defined object. – Majenko Jan 11 at 12:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.