Hallo Zusammen, in einem aktuellen Projekt nutze ich viele flags. Dafür habe ich mir ein globales Bitfield angelegt.Funktioniert soweit wie gewünscht. struct{ uint8_t test1_0 :1; uint8_t test1_1 :1; uint8_t test1_2 :1; uint8_t test1_3 :1; uint8_t test1_4 :1; uint8_t test1_5 :1; uint8_t test1_6 :1; uint8_t test1_7 :1; uint8_t test2_0 :1; uint8_t test2_1 :1; uint8_t test2_2 :1; uint8_t test2_3 :1; uint8_t test2_4 :1; }flag; flag.test1_0 = 1; // flag setzen: if(flag.test1_0) // flag abragen Nun meine Frage, wie kann ich dieses Bitfeld "extern" deklarieren, damit ich auf von anderen C-Dateien auf die Flags zugreifen kann? Vielen Dank im Voraus für eure Hilfe. Gruss Markus
Hallo, In dem man extern davor setzt und dies in eine Header Datei einbindet.
Hallo karl, hmm, also zusätzlich im main.h extern struct{ uint8_t test1_0 :1; uint8_t test1_1 :1; uint8_t test1_2 :1; uint8_t test1_3 :1; uint8_t test1_4 :1; uint8_t test1_5 :1; uint8_t test1_6 :1; uint8_t test1_7 :1; uint8_t test2_0 :1; uint8_t test2_1 :1; uint8_t test2_2 :1; uint8_t test2_3 :1; uint8_t test2_4 :1; }flag; und dann das main.h in den weiteren *.c-dateien einbinden? funktioniert leider nicht, Atmel Studio bringt mir die Fehler: "previous declaration of 'flag' was here" "conflicting types for 'flag'"
Markus schrieb: > und dann das main.h in den weiteren *.c-dateien einbinden? > > funktioniert leider nicht, Atmel Studio bringt mir die Fehler: > "previous declaration of 'flag' was here" > "conflicting types for 'flag'" Das extern kommt in eine Header Datei und die bindest du überall ein wo du die Struktur brauchst. Die Struktur selbst kommt in EINE C Datei.
In einer Header-Datei:
1 | struct MyFlags { |
2 | uint8_t test1_0 :1; |
3 | uint8_t test1_1 :1; |
4 | uint8_t test1_2 :1; |
5 | uint8_t test1_3 :1; |
6 | uint8_t test1_4 :1; |
7 | uint8_t test1_5 :1; |
8 | uint8_t test1_6 :1; |
9 | uint8_t test1_7 :1; |
10 | uint8_t test2_0 :1; |
11 | uint8_t test2_1 :1; |
12 | uint8_t test2_2 :1; |
13 | uint8_t test2_3 :1; |
14 | uint8_t test2_4 :1; |
15 | };
|
16 | |
17 | extern struct MyFlags flag; |
Dann in einer Source-Datei:
1 | struct MyFlags flag; |
Vielen Dank Dr. Sommer, das funktioniert :D Einen schönen Freitag euch allen, und nochmals danke an alle für die schnelle Hilfe!
In einer Header-Datei:
1 | typedef struct { |
2 | ...
|
3 | }MyFlags_t; |
4 | |
5 | extern MyFlags_t flag; |
Dann in einer Source-Datei:
1 | MyFlags_t flag; |
geht auch.
Dr. Sommer schrieb: > In einer Header-Datei:struct MyFlags { > uint8_t test1_0 :1; > uint8_t test1_1 :1; > uint8_t test2_2 :1; > uint8_t test2_3 :1; > uint8_t test2_4 :1; > }; > > extern struct MyFlags flag; > Dann in einer Source-Datei: > struct MyFlags flag; Und wenn man in der Headerdatei die Struktur definiert und die Variable erzeugt. Und in der Source-Datei (diese Variable) nur deklariert? Also so: in einer Header-Datei:
1 | struct MyStruct { |
2 | .....
|
3 | };
|
4 | |
5 | //dann die Variable anlegen
|
6 | |
7 | struct MyStruct x; |
und in einer Source-Datei:
1 | //nur Deklaration einer bereits erzeugten Variable
|
2 | extern struct MyStruckt x; |
Ist diese Vorgehensweise schlechter?
zitter_ned_aso schrieb: > Ist diese Vorgehensweise schlechter? Ja, weil es beim Linken dann "Multiple Definition" Errors gibt. Eine Deklaration mit "extern" ist außerdem sinnlos wenn bereits eine Definition ohne "extern" sichtbar ist.
Dr. Sommer schrieb: > Eine > Deklaration mit "extern" ist außerdem sinnlos wenn bereits eine > Definition ohne "extern" sichtbar ist. Und wenn sie nicht sichtbar ist? Die globalen Variablen macht man ja auch per
1 | extern typ name; |
sichtbar.
ja, danke für diesen Hinweis! Dr. Sommer schrieb: > weil es beim Linken dann "Multiple Definition" Errors gibt Ich war "googeln" - jetzt ist es klarer. https://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables-between-source-files https://stackoverflow.com/questions/31925442/defining-an-extern-variable-in-the-same-header-file
Doch noch eine Frage dazu: Warum führt mehrfaches Einbinden dieser Headerdatei zu einem Fehler wie "redefinition"/"multiple definition", aber nur dann wenn man unten, im Headerfile, die struct-Variable anlegt? File: mystruct.h
1 | struct MyStruct { |
2 | .....
|
3 | };
|
4 | |
5 | struct MyStruct x; |
Warum ist es OK die Struktur selbst mehrfach zu definieren? Ich ändere also die letzte Zeile
1 | extern struct MyStruct x; |
Und dann kann ich diese Headerdatei in mehreren C-Files einbinden. Aber warum sagt der Compiler nicht, dass da auch die Struktur mehrfach definiert wurde? Oder ist es dem Compiler egal, weil keine Variable angelegt wurde (sprich kein Speicherplatz reserviert werden muss = nur eine Deklaration)?
Der Compiler sieht ja immer nur eine .c Datei. In dieser ist der Header und damit die Struktur dann im Normalfall auch nur einmal deklariert. Es ist der Linker, der dann ein Problem bekommt, wenn eine Variable in mehreren Dateien definiert wurde. Also Speicherplatz angefordert wurde, genau wie du vermutest...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.