Struct als extern deklarieren

Gast #1925280
Lesenswert?

Hallo!

Der extern Befehl ist mir normalerweise bekannt. Aber mit einem struct 
scheint es per gcc(WINAVR) nicht zu funktionieren?!?

Habt ihr Erfahrungen?

main.c:
volatile struct bit
{
  unsigned trigger:1;
  unsigned state_1:1;
  unsigned state_2:1;
  unsigned open_signal:1;
  unsigned http:1;
}flag;


externes modul:

extern volatile bit flag;

so funktioniert es nicht. Ich weiß hier nicht, was ich falsch mache. 
Eigentlich hatte das Strukt den Namen "bit" nicht. Diesen habe ich 
vergeben, damit ich weiß, was ich als extern deklarieren muss.
#1925287
Lesenswert?

Timo P schrieb:

> externes modul:
>
> extern volatile bit flag;
>
> so funktioniert es nicht. Ich weiß hier nicht, was ich falsch mache.

Wenn du Compiler wärst und du nur dieses hier zur Verfügung hast

modul.c
*******
1
extern volatile bit flag;

woher weißt du, wie die Struktur aussieht, welche Member sie hat und wie 
diese Member angeordnet sind?


Jedes C-File wird für sich alleine compiliert, ohne Ansehen von anderen 
*.c File.
Wenn du daher die Struktur in einem anderem C File hast, dann ist das 
nett, hilft aber dem Modul.c nichts. Denn das hat diese 
Strukturdefinition nicht zur Verfügung.
Persönliche Seite #1925303
Lesenswert?

Hier passieren zwei Dinge gleichzeitig:
1
volatile struct bit
2
{
3
  unsigned trigger:1;
4
  unsigned state_1:1;
5
  unsigned state_2:1;
6
  unsigned open_signal:1;
7
  unsigned http:1;
8
}flag;

Einerseits wird ein Strukturtyp deklariert (struct bit), andererseits 
wird eine Variable dieses Typs definiert.

Um diese Variable aus anderen Modulen heraus verwenden zu können, muss 
in anderen Modulen der Strukturtyp bekannt sein.

Daher sollten die beiden Dinge voneinander getrennt werden:
1
struct bit
2
{
3
  unsigned trigger:1;
4
  unsigned state_1:1;
5
  unsigned state_2:1;
6
  unsigned open_signal:1;
7
  unsigned http:1;
8
};
9

10
volatile struct bit flag;

Als nächster Schritt kann jetzt die Deklaration des Strukturtyps in eine 
Headerdatei ausgelagert werden, damit sie anderen Modulen bekanntgemacht 
werden kann.

In der Headerdatei steht dann folgendes:
1
struct bit
2
{
3
  unsigned trigger:1;
4
  unsigned state_1:1;
5
  unsigned state_2:1;
6
  unsigned open_signal:1;
7
  unsigned http:1;
8
};
9

10
extern volatile struct bit flag;


und im C-Sourcefile, in dem die Variable "flag" definiert wird, steht 
nur noch
1
volatile struct bit flag;

(und natürlich vorher die #include-Anweisung für die Headerdatei)
Gast #1925313
Lesenswert?

Die Idee mit dem Auslagern in die Headerfile scheint mir sehr sinvoll, 
wenn ich sowieso schon modularisiere.

Frage am Rande:

wenn ich eine main.h habe, die ich von mehreren modulen aus einbinde, 
wie kann ich verhindern, dass defines oder includes mehrfach ausgeführt 
werden?

ein
#ifdef main.h
....
#endif

funzt nicht
Gast #1925316
Lesenswert?

Du musst den Struct in einem Header-File definieren (als typedef) und 
dieses Header-File überall includen, wo Du diesen Struckt verwenden 
willst.

Die Structvariable kann dann in irgend einem C-File global deklariert 
werden und mittels extern in den anderen C-Files importiert werden
Gast #1925319
Lesenswert?

@ Peter:

Ja, das habe ich gerade umgesetzt. Es ist auch in meine main.h 
gewandert.

Aber diese main.h includiere ich von vielen modulen aus. Evtl. ist es 
hilfreich, Vorkehrungen zu treffen, dass die includes und defines aus 
der main.h nicht mehrfach durchgeführt werden.
Persönliche Seite #1925322
Lesenswert?

Timo P schrieb:
> wenn ich eine main.h habe, die ich von mehreren modulen aus einbinde,
> wie kann ich verhindern, dass defines oder includes mehrfach ausgeführt
> werden?

Sofern Du in der Headerdatei nur Dinge deklarierst, sie aber nicht 
definierst, wird da nichts "mehrfach ausgeführt".

Oder bindest Du Deine mehreren Module selbst etwa auch mit #include ein?
Gast #1925325
Lesenswert?

Timo P schrieb:
> wenn ich eine main.h habe, die ich von mehreren modulen aus einbinde,
> wie kann ich verhindern, dass defines oder includes mehrfach ausgeführt
> werden?
>
> ein
> #ifdef main.h
> ....
> #endif
>
> funzt nicht
1
#ifndef __main_h__ //man beachte das 'n'!
2
#define __main_h__
3
//Code
4
#endif

Manchmal steht noch ein Wert hinter dem #define, vermutl. ich das in 
bestimmten Fällen (welchen?) nötig um einen Fehler bei der 
"Präprocessierung" zu vermeiden.
#1925332
Lesenswert?

Es ist auch hilfreich, wenn Du aus dem Struct gleich einen Datentyp 
machst.
Also irgendwie so:

typedef struct
{
  unsigned trigger:1;
  unsigned state_1:1;
  unsigned state_2:1;
  unsigned open_signal:1;
  unsigned http:1;
} bit_type;

Dann kannst Du ganz normal mit dem Ding hantieren wie mit anderen Typen.

Vorwärtsdeklaraton in H Datei:
extern volatile bit_type flags;

Typ deklarieren in C Datei:
volatile bit_type flags;

Verwendung in C Datei:
flags.trigger = 1;

Sollte in etwa so funktionieren, aber habe es nicht getestet.

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