Wie liest man C-Meldungen?

Lesezeit: 6 Minuten

Benutzeravatar von 1729
1729

Ich habe von einigen Methoden gehört, aber keine davon ist hängengeblieben. Persönlich versuche ich, komplexe Typen in C zu vermeiden und versuche, sie in Komponenten-Typedef zu zerlegen.

Ich bin jetzt damit konfrontiert, einen alten Code von einem sogenannten ‘Drei-Sterne-Programmierer’ zu pflegen, und es fällt mir schwer, einen Teil des ***-Codes zu lesen[][].

Wie lesen Sie komplexe C-Deklarationen?

  • Augen funktionieren … Aber wenn Sie mit Windows nicht weiterkommen, könnten Sie Narrator ausprobieren.

    – Shog9

    18. September 2008 um 1:05 Uhr

  • Bedeutet „Drei-Sterne-Programmierer“ also, dass in allen von ihm deklarierten Typen mindestens drei Sterne vorhanden sind?

    – Steve Jessop

    18. September 2008 um 1:06 Uhr

  • Es ist so ziemlich eine Beleidigung der alten Schule für einen schlechten C-Programmierer

    – 1729

    18. September 2008 um 1:08 Uhr

  • Hier ist ein Webseite um dies für Sie zu automatisieren!

    – Rüschenwind

    17. Februar 2015 um 20:25 Uhr

  • Und für ***code[][]es kehrt zurück syntax error 🙂 Trotzdem eine verdammt nützliche Seite.

    – Mawg sagt, Monica wieder einzusetzen

    22. Dezember 2016 um 11:25 Uhr


Benutzeravatar von Eli Courtwright
Eli Gerichtsschreiber

Dieser Artikel erklärt relativ einfache 7 Regeln, mit denen Sie jede C-Deklaration lesen können, wenn Sie dies manuell tun möchten oder müssen: http://www.ericgiguere.com/articles/reading-c-declarations.html

  1. Finden Sie die Kennung. Dies ist Ihr Ausgangspunkt. Schreiben Sie auf ein Blatt Papier „Kennung deklarieren als“.
  2. Schau nach rechts. Wenn dort nichts oder eine rechte Klammer “)” vorhanden ist, gehen Sie zu Schritt 4.
  3. Sie befinden sich jetzt entweder auf einem Array- (linke Klammer) oder einem Funktionsdeskriptor (linke Klammer). Es kann eine Folge davon geben, die entweder mit einer nicht übereinstimmenden rechten Klammer oder dem Ende des Deklarators (einem Semikolon oder einem “=” für die Initialisierung) endet. Für jeden dieser Deskriptoren, von links nach rechts gelesen:

    • wenn ein leeres Array “[]”, schreiben Sie “Array von”
    • wenn ein Array mit einer Größe, schreiben Sie “Array-Größe von”
    • wenn eine Funktion “()”, schreibe “Funktion kehrt zurück”

    Halten Sie an der nicht übereinstimmenden Klammer oder am Ende des Deklarators an, je nachdem, was zuerst eintritt.

  4. Kehre in die Ausgangsposition zurück und schaue nach links. Wenn dort nichts oder eine linke Klammer “(” steht, gehen Sie zu Schritt 6.
  5. Sie befinden sich jetzt auf einem Zeigerdeskriptor “*”. Es kann links davon eine Folge geben, die entweder mit einer nicht übereinstimmenden linken Klammer “(” oder dem Beginn des Deklarators endet. Lesen Sie von rechts nach links, schreiben Sie für jeden Zeigerdeskriptor “Zeiger auf”. Stoppen Sie bei der nicht übereinstimmenden Klammer oder Beginn des Deklarators, je nachdem, was zuerst eintritt.
  6. An dieser Stelle haben Sie entweder einen eingeklammerten Ausdruck oder den vollständigen Deklarator. Wenn Sie einen Ausdruck in Klammern haben, betrachten Sie ihn als Ihren neuen Ausgangspunkt und kehren Sie zu Schritt 2 zurück.
  7. Notieren Sie den Typbezeichner. Halt.

Wenn Sie mit einem Tool zufrieden sind, unterstütze ich den Vorschlag, das Programm zu verwenden cdecl: http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

  • Es scheint viele Implementierungen von zu geben cdecl, sogar einer im K&R-Buch. Aber alle von ihnen übersetzen nur ins/aus dem einfachen Englisch. Ich möchte jedoch zu/von einer internen Darstellung übersetzen, wie es ein Compiler tut. Ich meine, lesen Sie eine C-Deklaration und “kodieren” Sie sie in einer Art Datenstruktur. Welche Datenstruktur wäre erforderlich, um eine beliebige C-Deklaration darzustellen?

    – zess

    21. April um 10:40 Uhr

Benutzeravatar von Sundar R
Sundar R

Ich verwende im Allgemeinen das, was manchmal als „Regel der rechten Hand im Uhrzeigersinn“ bezeichnet wird. Es geht so:

  • Beginnen Sie mit der Kennung.
  • Gehen Sie direkt rechts davon.
  • Bewegen Sie sich dann im Uhrzeigersinn und kommen Sie auf die linke Seite.
  • Bewegen Sie sich im Uhrzeigersinn und kommen Sie auf die rechte Seite.
  • Tun Sie dies, solange die Deklaration noch nicht vollständig geparst wurde.

Es gibt eine zusätzliche Meta-Regel, die beachtet werden muss:

  • Wenn Klammern vorhanden sind, vervollständigen Sie jede Klammerebene, bevor Sie fortfahren.

„Gehen“ und „bewegen“ bedeutet hier, das Symbol dort zu lesen. Die Regeln dafür lauten:

  • * – Zeiger auf
  • () – Funktion kehrt zurück
  • (int, int) – Funktion, die zwei Ints nimmt und zurückgibt
  • int, charetc. – int, charetc.
  • [] – Anordnung von
  • [10] – Array von zehn
  • usw.

Also zum Beispiel int* (*xyz[10])(int*, char) wird gelesen als:

xyz ist ein

Reihe von zehn

Zeiger auf

Funktion, die ein int* und ein char nimmt und zurückgibt

ein int*

  • @sundar: sehr schöne Referenz!

    – Laser

    26. März 2010 um 17:46 Uhr

  • @sundar: Können Sie es um mehrdimensionale Arrays und Funktionszeiger erweitern? Wie wäre es mit extern char *const (*goop( char *b ))( int, long );? (abgeholt von ericgiguere.com/articles/reading-c-declarations.html)

    – Laser

    26. März 2010 um 18:34 Uhr

Benutzeravatar von Dark Shikari
Dunkle Shikari

Ein Wort: cdekl

Verdammt, um 15 Sekunden geschlagen!

  • Siehe meinen Kommentar oben. Zum ***code[][]es kehrt zurück syntax error 🙂 Trotzdem eine verdammt nützliche Seite

    – Mawg sagt, Monica wieder einzusetzen

    22. Dezember 2016 um 11:29 Uhr

Cdecl (und c++decl) ist ein Programm zum Codieren und Decodieren von Deklarationen vom Typ C (oder C++).

http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

Damals, als ich C machte, benutzte ich ein Programm namens “cdecl”. Es scheint, dass es in Ubuntu Linux im cutils- oder cdecl-Paket enthalten ist und wahrscheinlich auch anderswo verfügbar ist.

Antti Haapala -- Benutzeravatar von Слава Україні
Antti Haapala – Слава Україні

cdecl bietet eine Befehlszeilenschnittstelle, also probieren wir es aus:

cdecl> explain int ***c[][]
declare c as array of array of pointer to pointer to pointer to int

ein anderes Beispiel

explain int (*IMP)(ID,SEL) 
declare IMP as pointer to function (ID, SEL) returning int

Allerdings gibt es dazu im Buch “C Deep Secrets” ein ganzes Kapitel mit dem Titel “Unscrambling Declarations in C.

Benutzeravatar von outis
außen

Bin gerade auf einen erhellenden Abschnitt in “Die Entwicklung der C-Sprache“:

Für jedes Objekt eines solchen zusammengesetzten Typs gab es bereits eine Möglichkeit, das zugrunde liegende Objekt zu erwähnen: Indizieren Sie das Array, rufen Sie die Funktion auf, verwenden Sie den Indirektionsoperator für den Zeiger. Analoges Denken führte zu einer Deklarationssyntax für Namen, die die Ausdruckssyntax widerspiegelt, in der die Namen typischerweise vorkommen. Daher,

int i, *pi, **ppi;

Deklarieren Sie eine Ganzzahl, einen Zeiger auf eine Ganzzahl, einen Zeiger auf einen Zeiger auf eine Ganzzahl. Die Syntax dieser Deklarationen spiegelt die Beobachtung wider, dass i, *pi und **ppi alle einen int-Typ ergeben, wenn sie in einem Ausdruck verwendet werden. Ähnlich,

int f(), *f(), (*f)();

deklarieren Sie eine Funktion, die eine Ganzzahl zurückgibt, eine Funktion, die einen Zeiger auf eine Ganzzahl zurückgibt, einen Zeiger auf eine Funktion, die eine Ganzzahl zurückgibt;

int *api[10], (*pai)[10];

Deklarieren Sie ein Array von Zeigern auf Ganzzahlen und einen Zeiger auf ein Array von Ganzzahlen. In all diesen Fällen ähnelt die Deklaration einer Variablen ihrer Verwendung in einem Ausdruck, dessen Typ der am Anfang der Deklaration genannte ist.

1407050cookie-checkWie liest man C-Meldungen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy