[C] Bitfeld extern deklarieren

Gast #5709426
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
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
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
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
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 #5710394
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.
Gast #5711187
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.