Forum: Mikrocontroller und Digitale Elektronik [C] Bitfeld extern deklarieren


von Markus (Gast)


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

von Karl M. (Gast)


Lesenswert?

Hallo,

In dem man extern davor setzt und dies in eine Header Datei einbindet.

von Markus (Gast)


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'"

von Cyblord -. (cyblord)


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.

von Dr. Sommer (Gast)


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;

von Markus (Gast)


Lesenswert?

Vielen Dank Dr. Sommer, das funktioniert :D

Einen schönen Freitag euch allen, und nochmals danke an alle für die 
schnelle Hilfe!

von Volker S. (vloki)


Lesenswert?

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.

von zitter_ned_aso (Gast)


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?

von Dr. Sommer (Gast)


Lesenswert?

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.

von zitter_ned_aso (Gast)


Lesenswert?

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.

von zitter_ned_aso (Gast)


Lesenswert?


von zitter_ned_aso (Gast)


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)?

von Volker S. (vloki)


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

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
Noch kein Account? Hier anmelden.