Problem mit typedef struct

Gast #1613543
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
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
>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
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^^
Gast #1613749
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
Gast #1613753
> #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
Moderator Persönliche Seite #1614007
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.