Forum: Compiler & IDEs Problem mit typedef struct


von struct (Gast)


Lesenswert?

Ich habe in einem header file eine typedef:
1
#ifndef SMS_DECODE_DATA_TYPE
2
#define SMS_DECODE_DATA_TYPE
3
typedef struct {
4
  char nachricht[161];   // decodierte PDU Nachricht
5
  char telnr[16];      // Telefonnummer des Absenders
6
  struct {
7
      uint8_t year;
8
      uint8_t month;
9
      uint8_t day;
10
      uint8_t hour;
11
    uint8_t minute;
12
    uint8_t second;
13
  } date;
14
} SMS_DECODE_DATA_TYPE;
15
#endif

Da das Header File in mehreren c Files eingebunden wird, habe ich das 
macro darum herum geschrieben um eine doppelte Deklaration zu vermeiden.

Nun bekomme ich aber die für mich wenig aussagekräftige Warnungen
in der Header Datei:
../sms.h:30: warning: unnamed struct/union that defines no instances

und in der c Datei in welcher ich "SMS_DECODE_DATA_TYPE sms_dec_data;" 
anlege:
../main.c:5: warning: data definition has no type or storage class
../main.c:5: warning: type defaults to 'int' in declaration of 
'sms_dec_data'
../main.c: In function 'main':

Kann mir da bitte mal jemand weiterhelfen. Ich hab schon mein C Buch zu 
Rate gezogen und G****e bemüht - bin aber nicht wirklich fündig 
geworden.

von struct (Gast)


Lesenswert?

sry, was vergessen:
Ich arbeite mir AVR-Studio 4.14 Build 589 in Verbindung mit 
WinAVR-20080610

von Bernhard R. (barnyhh)


Lesenswert?

Die innere Struktur ist ohne Strukturnamen. Definiere mal die inner 
Struktur vor der äußeren per entsprechendem typedef und sprich sie nur 
über diesen typedef-namen an.

Bernhard

von Sven P. (Gast)


Lesenswert?

Kann es sein, dass sich der Bezeichner des Typedefs 
(SMS_DECODE_DATA_TYPE) mit einer Konstante des Präprozessors 
(SMS_DECODE_DATA_TYPE) beißt?

von struct (Gast)


Lesenswert?

Sven P. schrieb:
> Die innere Struktur ist ohne Strukturnamen.

Die innere Struktur hat den Namen "date".
1
  struct {
2
      uint8_t year;
3
      uint8_t month;
4
      uint8_t day;
5
      uint8_t hour;
6
    uint8_t minute;
7
    uint8_t second;
8
  } date;
Selbst wenn ich die innerer Struktur komplett weglasse, kommen die 
selben warnings.

Sven P. schrieb:
> Kann es sein, dass sich der Bezeichner des Typedefs
> (SMS_DECODE_DATA_TYPE) mit einer Konstante des Präprozessors
> (SMS_DECODE_DATA_TYPE) beißt?

Ja, das wars. Bei dem Konstrukt:
1
#ifndef SMS_DECODE_DATA_TYPE
2
#define SMS_DECODE_DATA_TYPE
3
typedef struct {
4
  char nachricht[161];   // decodierte PDU Nachricht
5
  char telnr[16];      // Telefonnummer des Absenders
6
  struct {
7
      uint8_t year;
8
      uint8_t month;
9
      uint8_t day;
10
      uint8_t hour;
11
    uint8_t minute;
12
    uint8_t second;
13
  } date;
14
} SMS_DECODE_DATA_TYPE;
15
#endif
sind der NAme des defines (#define SMS_DECODE_DATA_TYPE) und der name 
der struct genau die gleichen. Ich hab jetzt einfach den Namen des 
#defines geändert:
1
[c]
2
#ifndef SMS_DECODE_DATA_TYPE1
3
#define SMS_DECODE_DATA_TYPE1
4
typedef struct {
5
  char nachricht[161];   // decodierte PDU Nachricht
6
  char telnr[16];      // Telefonnummer des Absenders
7
  struct {
8
      uint8_t year;
9
      uint8_t month;
10
      uint8_t day;
11
      uint8_t hour;
12
    uint8_t minute;
13
    uint8_t second;
14
  } date;
15
} SMS_DECODE_DATA_TYPE;
16
#endif

Danke für die schnelle Hilfe. Ich sitz schon wieder zu lange davor, dass 
man die kleinen Fehler nicht mehr sieht. Brauch wohl mal ne Pause.

von Oliver (Gast)


Lesenswert?

>Da das Header File in mehreren c Files eingebunden wird, habe ich das
>macro darum herum geschrieben um eine doppelte Deklaration zu vermeiden.

Der übliche Weg wäre es, das ganze headerfile mit
1
#infdef SMS_H
2
#define SMS_H
3
...
4
#endif

gegen doppeltes Einbinden zu schützen.

Oliver

von struct (Gast)


Lesenswert?

Naja, da sind ja sonst nur Definitionen drin, also alle globalen 
Variablen und Funktionen mit extern. Bei structs scheint das aber nicht 
zu klappen, deswegen der Umweg über das Makro. Mit dem kompletten 
"ausblenden" spart natürlich Arbeit bei mehreren structs. Müsste dann 
aber sicherlich so aussehen:
1
#ifndef SMS_H
2
#define SMS_H
3
...
4
#endif

Das könnte man sich aber mal generell angewöhnen. Kommt ja häufiger vor, 
dass Header Dateien doppelt eingebunden werden --> und dann wundert man 
sich über die Fehler^^

von Oliver (Gast)


Lesenswert?

>Das könnte man sich aber mal generell angewöhnen.

"Fortgeschrittene" Editoren, wie der von Eclipse, machen so etwas 
automatisch.

Oliver

von struct (Gast)


Lesenswert?

gur zu wissen. Hab mir gerade mal die Standad Header File wie 
<avr/interrupt.h> angeschaut, da ist es auch immer so. Werd ich ab jetzt 
auch so machen.

THX

von klaus (Gast)


Lesenswert?

> #ifndef SMS_H
>
> #define SMS_H
>
> ...
>
> #endif


Tipp: Macht man es wie folgt, hat man solche Probleme nicht:
1
#ifndef SMS_H
2
#define SMS_H SMS_H
3
4
...
5
6
#endif

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

struct schrieb:
> Hab mir gerade mal die Standad Header File wie
> <avr/interrupt.h> angeschaut, da ist es auch immer so.

Es gibt Ausnahmen. ;-)  Beispielsweise kann man <assert.h> sinnvoll
mehr als einmal inkludieren, <util/setbaud.h> ebenfalls.

Aber für den Normalfall ist dieses "idempotence ifdef" angebracht.

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.