mikrocontroller.net

Forum: Compiler & IDEs Problem mit typedef struct


Autor: struct (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in einem header file eine typedef:
#ifndef SMS_DECODE_DATA_TYPE
#define SMS_DECODE_DATA_TYPE
typedef struct {
  char nachricht[161];   // decodierte PDU Nachricht
  char telnr[16];      // Telefonnummer des Absenders
  struct {
      uint8_t year;
      uint8_t month;
      uint8_t day;
      uint8_t hour;
    uint8_t minute;
    uint8_t second;
  } date;
} SMS_DECODE_DATA_TYPE;
#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.

Autor: struct (Gast)
Datum:

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

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: struct (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Die innere Struktur ist ohne Strukturnamen.

Die innere Struktur hat den Namen "date".
  struct {
      uint8_t year;
      uint8_t month;
      uint8_t day;
      uint8_t hour;
    uint8_t minute;
    uint8_t second;
  } 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:
#ifndef SMS_DECODE_DATA_TYPE
#define SMS_DECODE_DATA_TYPE
typedef struct {
  char nachricht[161];   // decodierte PDU Nachricht
  char telnr[16];      // Telefonnummer des Absenders
  struct {
      uint8_t year;
      uint8_t month;
      uint8_t day;
      uint8_t hour;
    uint8_t minute;
    uint8_t second;
  } date;
} SMS_DECODE_DATA_TYPE;
#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:
[c]
#ifndef SMS_DECODE_DATA_TYPE1
#define SMS_DECODE_DATA_TYPE1
typedef struct {
  char nachricht[161];   // decodierte PDU Nachricht
  char telnr[16];      // Telefonnummer des Absenders
  struct {
      uint8_t year;
      uint8_t month;
      uint8_t day;
      uint8_t hour;
    uint8_t minute;
    uint8_t second;
  } date;
} SMS_DECODE_DATA_TYPE;
#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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#infdef SMS_H
#define SMS_H
...
#endif

gegen doppeltes Einbinden zu schützen.

Oliver

Autor: struct (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef SMS_H
#define SMS_H
...
#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^^

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das könnte man sich aber mal generell angewöhnen.

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

Oliver

Autor: struct (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #ifndef SMS_H
>
> #define SMS_H
>
> ...
>
> #endif


Tipp: Macht man es wie folgt, hat man solche Probleme nicht:
#ifndef SMS_H
#define SMS_H SMS_H

...

#endif

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.