C-Frage

Gast #238164
Lesenswert?
• ▲
▼
Hallo C-Spezialisten,

ich habe ein Problem mit fogendem wohl nicht ganz ANSI-konformen
Programmschnipsel:

typedef union uREG08
    {
    uint8_t  byte;
    struct      {
      uint8_t _0 :1;
      uint8_t _1 :1;
      uint8_t _2 :1;
      uint8_t _3 :1;
      uint8_t _4 :1;
      uint8_t _5 :1;
      uint8_t _6 :1;
      uint8_t _7 :1;
      }bit;
    }tREG08;

Was bedeutet z.B.

uint8_t _0 :1;

wie schreibt man das ANSI konform?

Vielen Dank

Carola
Gast #238165
Lesenswert?
• ▲
▼
> ich habe ein Problem mit fogendem wohl nicht ganz ANSI-konformen
> Programmschnipsel:

Wie kommst du darauf?

> Was bedeutet z.B.
>
> uint8_t _0 :1;

Es bedeutet, daß in der Struct ein Element mit Namen _0 angelegt wird,
das nur ein einziges Bit breit is.

> wie schreibt man das ANSI konform?

Genauso.
Moderator Persönliche Seite #238169
Lesenswert?
• ▲
▼
Der führende Unterstrich im Element-Namen ist übrigens wirklich
nicht ganz standardkonform, da führende Unterstriche für ,,die
Implementierung'' reserviert sind (sprich: für Compiler und
Bibiothek).  Ersetze die Unterstriche besser durch ein ,b' zum
Beispiel, also auf die Bits kann man dann zugreifen mit val.bit.b0.

Btw., der Standard überlässt die Bitreihenfolge der jeweiligen
Implementierung.  Der entsprechende Code ist also zwar
standardkonform, aber mitnichten portabel.
Gast #238170
Lesenswert?
• ▲
▼
> Der führende Unterstrich im Element-Namen ist übrigens wirklich
> nicht ganz standardkonform, da führende Unterstriche für ,,die
> Implementierung'' reserviert sind (sprich: für Compiler und
> Bibiothek).

Das stimmt nicht. Reserviert sind nur führende Unterstriche, auf die
ein Großbuchstabe oder ein weiterer Unterstrich folgt. Alles andere,
was mit Unterstrich anfängt, ist zwar teilweise auch reserviert, aber
auf struct-Members trifft es nicht zu.

> Btw., der Standard überlässt die Bitreihenfolge der jeweiligen
> Implementierung.  Der entsprechende Code ist also zwar
> standardkonform, aber mitnichten portabel.

Naja, "mitnichten" ist doch etwas übertrieben. Es ist zwar in der
Norm (nicht Standard) nicht festgelegt, aber kennst du eine
Implementation, auf der das anders als oben erwartet ist? Ich gebe zu,
daß es bei 16 oder mehr bits wieder anders aussieht, wegen little
endian vs. big endian.
Moderator Persönliche Seite #238171
Lesenswert?
• ▲
▼
> Reserviert sind nur führende Unterstriche, auf die ein Großbuchstabe
> oder ein weiterer Unterstrich folgt. Alles andere, was mit
> Unterstrich anfängt, ist zwar teilweise auch reserviert, aber auf
> struct-Members trifft es nicht zu.

OK, hast Recht.  Allerdings sind die Regeln für den Rest so wenig
einprägsam, dass ich mir das eher nicht im Kopf behalten würde und auf
führende Unterstriche generell verzichten würde.

Erlaubt:

struct foo {
  int _bar;
};

Nicht erlaubt:

struct _foo {
  int bar;
};

Um das rauszufinden, muss ich aber wirklich erst im Standard
nachgucken.  (Klar, bei näherem Hinsehen ist eine gewisse Logik drin,
das _bar da oben kann mit nichts aus der Bibliothek kollidieren, da es
zum namespace von struct foo gehört und nur in diesem eine Bedeutung
hat.)

> Es ist zwar in der Norm (nicht Standard) nicht festgelegt, aber
> kennst du eine Implementation, auf der das anders als oben erwartet
> ist?

Hab' ich mir nie die Mühe gemacht, das anzusehen.  Da sie als
implementation defined bezeichnet werden, nehme ich sie für derartige
Zwecke einfach nicht, sondern nehme lieber gewöhnliche Bitmasken.  (An
dieser Stelle soll dem Vernehmen nach Ada einfach mal schlauer gewesen
sein.)  Bitfields sind trotzdem hin und wieder recht nett, z.B. wenn
man Platz sparen will und ein paar globale Interruptflags braucht,
denen man dann nicht jedem ein Byte spendieren möchte.

Antwort schreiben

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