[C] Bitfeld extern deklarieren

Gast #5709426
Lesenswert?

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
Gast #5709438
Lesenswert?

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'"
#5709440
Lesenswert?

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.
Gast #5709442
Lesenswert?

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;
Gast #5710388
Lesenswert?

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?
Gast #5711187
Lesenswert?

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)?
#5711200
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren