Worauf spielst du genau an? Ist "SSD1306 display(0x3c, D2, D1);" keine Definition?
Ist es.
Es ist eine Definition!
Darum muss/sollte sie in die *.cpp.
Denn wenn du sie in die *.h stopfen würdest, hättest du dieses Element in jeder Übersetzungseinheit definiert.
Also mehrfach.
Dem Compiler ist das recht.
Der sieht jede Übersetzungseinheit einzeln.
Aber, dann schimpft der Linker mit dir!
Denn der kann bei Mehrdeutigkeiten, nicht die ausführbare Datei zusammen klöppeln.
extern SSD1306 display;
Das ist eine Deklaration.
Die gehört in die *.h, wenn display global sein soll.
Die Alternative:
Oder bin ich nur zu doof es in die *.h zu packen?
Wenn du in der *.h
static SSD1306 display(0x3c, D2, D1);
schreibst...
Dann bekommt jede der Übersetzungseinheiten ihre eigene display Variable.
Das static sorgt dafür, dass der Linker die display Dinger gar nicht mehr zu sehen bekommt.
Ich glaube, bei dem Display, wäre das static ein Fehler.
Denn du hast nur ein Display.
Aber beim fummeln mit Konstanten, ist das sehr sinnvoll!
(auch für inline Funktionen)
In der *.ino
const byte led = 13;
Wird komplett vom Kompiler weg optimiert.
Frist also kein Brot.
in der *.h
const byte led;
in der *.cpp
const byte led = 13;
Frisst 1 Byte im Ram. Da der Linker die Adresse für alle Übersetzungseinheiten auflösen können muss.
in der *.h
static const byte led=13;
Stellt für jede Übersetzungseinheit eine eigene Konstante bereit.
Welche dann vom Compiler wegoptimiert wird.
Erinnert mich irgendwie an :
Dschungelbuch, die Schlange: "Glaube mir ...."