bei meinen Versuchen mit VS komme ich nicht weiter, es sieht Fehler die es selbst nicht sieht und ich erst recht nicht.
Gestern hat es mir beim kompilieren mit diesem Code ständig erzählt kalenderdaten hätte multiple Definitionen.
Zum testen habe ich kalenderdaten auskommentiert und
zeit_30s=34567;
eingefügt.
Spuckt er auch als multiple Definition aus -> gelöscht, kalenderdaten einkommentiert -> VS neu gestartet:
Stellt sich die Frage was ich hier falsch verstehe?
README aus include:
A header file is a file containing C declarations and macro definitions to be shared between several project source files. You request the use of a header file in your project source file (C, C++, etc) located in src folder by including it, with the C preprocessing directive `#include'.
Ich weiß nicht, was du falsch verstehst.
Aber offensichtlich interessieren dich nicht die grundlegenden C++ Sprach und Compiler Zusammenhänge.
Das ist einerseits schade, weil du so auch unsere Antworten nicht verstehen wirst, und andererseits noch viel häufiger in solche Probleme stolpern willst.
Erster Tipp:
Denke in Übersetzungseinheiten.
Zweiter:
Unterscheide zwischen Deklaration und Definition.
Soweit ich mich erinnern kann, wurde dir schon mal ein C++ Buch empfohlen.
Hast du das auswendig gelernt?
Wenn nein, dann bitte machen.
Ganz sicher werde ich mit knapp 70 wegen eines Hobbys in den Wintermonaten nicht anfangen mich in etwas einzulernen das Jahre dauert und mit dem der Großteil der heutigen Jugend restlos überfordert sein dürfte.
Bei speziellen Sachen knie ich mich rein, aber das reicht mir. Meine Programme müssen nicht high-End-Ansprüchen genügen, sie sollen machen was ich will.
Wenn Du nicht helfen willst lass es und warte auf das Alter, vielleicht begreifst Du dann meinen Ansatz.
Wäre eine gute Ergänzung zu deinen recht allgemein gehaltenen Tips gewesen, @combie.
Ist ein Scherz der nicht viel besser kommt als
"Hast du nicht zugehört, als ich dir das Buch vorgelesen habe?"
Weißt du noch, wo das Buch ist? Wenn nicht, google "C++ Variablen-Deklaration und -Definition". Das ist auch --oder speziell-- für uns Ü70 Pflicht, bevor wir uns hier über VisualStudio beschweren.
Wobei mir da ein paar Sachen nicht gefallen, die auf anderer Ebene wohnen.
Quasi andere Themen betreffen.
Da stecken 2 Unsauberkeiten drin!
unsigned int mag auf 32Bit Systemen funktionieren, auf AVR/8Bit eher nicht.
Die 30 ist eine doppelte/redundante Information. Redundanzen sollte man vermeiden.
Vielleicht!
Vielleicht auch nicht.
Es gibt ja auch noch das genannte constexpr und das Päärchen static und inline.
Die alle drei oder vier(mit extern) das gleiche Problem lösen würden, mit etwas unterschiedlichen Seiteneffekten.
constexpr unterbindet den Fehler dadurch, dass gar kein adressierbares Speicheropjekt erzeugt wird.
static würde die Variable lokal zur Übersetzungseinheit definieren. Jede Übersetzungseinheit hätte dann eine Variable mit gleichem Namen.
inline definierte Variablen dürfen in mehreren Übersetzungseinheiten definiert sein, diese Definitionen müssen aber identisch sein, sonst UB(undefined Behavier)
extern ist nur deklarierend, die Definition muss woanders erfolgen.
Es ist also nicht ganz so leicht, zu entscheiden, was hier der richtige Weg ist.
Ich finde, er soll sein Buch lesen und verstehen. Das wird seine Handlungen leiten.
Dann kann ihm faktenbasierende Entscheidungen treffen.
Du musst kein komplettes C++ Buch auswendig lernen. Aber die Grundlagen musst Du kennen sonst wird auch das:
nicht funktionieren. Zu den Grundlagen gehört z.B. den Unterschied zwischen einer Deklaration und einer Definition zu kennen. Dann versteht man auch das:
D.h. in ein Header file gehören C-Deklarationen, aber keine C-Definitionen. Insofern ist eigentlich schon der Name 'definitionen.h' falsch.
Und das:
int zeit_30s = 30000;
int zeit_1m = 60000;
String kalenderdaten;
sind alles Definitionen. D.h. da wird Speicher im Ram für die Variable reserviert, und es wird diesem Speicherbereich ein Name zu geordnet. Und das darf es nur einmal geben, denn aus verständlichem Grund darf es keine 2 Variablen mit dem gleichen Namen geben. ( wir reden jetzt hier erstmal nur über globale Variable ).
Bei einer Deklaration informierst Du den Compiler nur darüber, dass es 'irgendwo' im Ram einen entsprechenden Speicherbereich für eine Variable mit diesem Namen gibt, die wird aber durch eine Deklaration nicht erneut eingerichtet. So entstehen dann auch keine doppelten gleichnamigen Variablen. Eine Deklaration ist dadurch gekennzeichent, dass man das Schlüsselwort 'extern' davor schreibt.
Natürlich muss die entsprechende Variable an EINER Stelle auch definiert werden, sonst ist sie ja gar nicht vorhanen, und der Linker meckert.