Problem mit typedef struct

Gast #1613543
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.
Gast #1613568
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.
Gast #1613582
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
Gast #1613742
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^^

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