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 '21 at 0:26
  • @jsotola do you mean JsonDocument instead StaticJsonDocument? it does not work either way
    – guyd
    Jan 10 '21 at 5:39
  • no ... you made a duplicate declaration
    – jsotola
    Jan 10 '21 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 '21 at 13:16
  • 1
    then put it in ino or add a cpp file
    – Juraj
    Jan 10 '21 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)
    – guyd
    Jan 11 '21 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 '21 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.