Objective-C Styleguide

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • mattik schrieb:


    Eine Deklaration sieht doch vereinfacht in etwa so aus:

    Quellcode

    1. <typ> <name>;



    Da liegt schon der Grundfehler, tut sie nicht, siehe auch die comp.lang.c FAQ:

    comp.lang.c FAQ schrieb:


    For example, in

    Quellcode

    1. char *pc;

    the base type is char, the identifier is pc, and the declarator is *pc; this tells us that *pc is a char (this is what ``declaration mimics use'' means).

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von SteveJ ()

  • SteveJ schrieb:

    mattik schrieb:


    Eine Deklaration sieht doch vereinfacht in etwa so aus:

    Quellcode

    1. <typ> <name>;



    Da liegt schon der Grundfehler, tut sie nicht


    int x
    declare x as int

    int*x
    declare x as pointer to int

    int x, y
    syntax error

    Wait, what?

    Bleibt also Bjarne Stroustrup's Meinung.
    Die scheint unauffindbar.

    Und ja, *pc ist ein Char. pc hingegen nicht. Und ich kann sowohl *pc als auch pc benutzen...
    What?

    Aber eigentlich braucht man diesen blöden Zeiger auch gar nicht.

    C-Quellcode

    1. char c = 'c';
    2. printf("Chars... %s|%d", c, &c);
    3. // Versus
    4. char pc = &c;
    5. printf("Chars... %s|%d", *pc, pc");

    Daraus schließen wir: pc=&c, *pc=c.
    What?

    Richtig wäre also als vereinfachte Deklaration:

    C-Quellcode

    1. <typ> <indikator, ob der bezeichner totale verwirrung stiften soll> <bezeichner>;
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • SteveJ schrieb:

    mattik schrieb:


    Eine Deklaration sieht doch vereinfacht in etwa so aus:

    Quellcode

    1. <typ> <name>;



    Da liegt schon der Grundfehler, tut sie nicht, siehe auch die comp.lang.c FAQ:

    comp.lang.c FAQ schrieb:


    For example, in

    Quellcode

    1. char *pc;

    the base type is char, the identifier is pc, and the declarator is *pc; this tells us that *pc is a char (this is what ``declaration mimics use'' means).

    Nein, der Fehler liegt darin, in comp.lang.c.FAQ zu schauen, anstatt in den Standard. Dort "6.7.6 Type names"
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    mattik schrieb:


    Eine Deklaration sieht doch vereinfacht in etwa so aus:


    Nein, der Fehler liegt darin, in comp.lang.c.FAQ zu schauen, anstatt in den Standard. Dort "6.7.6 Type names"


    Eine Versionsangabe wäre gut, bei ISO/IEC 9899:201x ist 6.7.6 "Declarators", was in diesem Zusammenhang richtig ist, und 6.7.7 "Type names". ^^

    ISO/IEC 9899:201x 6.7.6 schrieb:


    In the following subclauses, consider a declaration

    Quellcode

    1. T D1

    where T contains the declaration specifiers that specify a type T (such as int) and D1 is
    a declarator that contains an identifier ident. The type specified for the identifier ident in
    the various forms of declarator is described inductively using this notation.


    Also, <typ> <declarator>, wie in der comp.lang.c.FAQ, nix <typ> <name>. ;)
  • SteveJ schrieb:

    Amin Negm-Awad schrieb:

    mattik schrieb:


    Eine Deklaration sieht doch vereinfacht in etwa so aus:


    Nein, der Fehler liegt darin, in comp.lang.c.FAQ zu schauen, anstatt in den Standard. Dort "6.7.6 Type names"


    Eine Versionsangabe wäre gut, bei ISO/IEC 9899:201x ist 6.7.6 "Declarators", was in diesem Zusammenhang richtig ist, und 6.7.7 "Type names". ^^

    ISO/IEC 9899:201x 6.7.6 schrieb:


    In the following subclauses, consider a declaration

    Quellcode

    1. T D1

    where T contains the declaration specifiers that specify a type T (such as int) and D1 is
    a declarator that contains an identifier ident. The type specified for the identifier ident in
    the various forms of declarator is described inductively using this notation.


    Also, <typ> <declarator>, wie in der comp.lang.c.FAQ, nix <typ> <name>. ;)

    The older standard ISO/IEC 9899:1999 (aka C99) will soon be unavailable from official sources, due to the recent ISO adoption of C11.
    This is also effectively available for free as N1256.
    6.7.6 Type names . . . . . . . . . . . . . . . . . . . . . 122
    open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

    Spielt aber auch inhaltlich keine Rolle.

    ---

    Das widerspricht dem nicht. Du übersiehst offensichtlich, dass ein Type-Name nicht nur bei einem Declarator auftauchen kann

    Daher die Beispiel für den *Type*-Name, die etwa

    int *

    enthalten.

    Man kann das sich auch ganz einfach überlegen:

    (long)5

    enthält einen Type-Name, aber keinen Declarator.

    (int *)0

    Enthält einen Type-Name, aber keinen Declarator.

    Deshab gehört das Sternchen zum Type-Name und nicht zum Identifizier.

    Bitte genauer zwischen Declarator und Type-Name unterscheiden.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Amin Negm-Awad ()

  • mattik schrieb:

    Lucas de Vil schrieb:

    Richtig wäre also als vereinfachte Deklaration:

    Quellcode

    1. <typ> <indikator, ob der bezeichner totale verwirrung stiften soll> <bezeichner>;


    Aah! Das erklärt es.

    So verkehrt ist das gar nicht, weil der "Pointerteil" in der Tat eine Sonderrolle einnimmt.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Das widerspricht dem nicht. Du übersiehst offensichtlich, dass ein Type-Name nicht nur bei einem Declarator auftauchen kann


    Ein "Type name" taucht bei einem "Declarator" gar nicht auf. Ein Deklarator braucht einen Bezeichner ("Identifier"), sonst kann er ja nichts deklarieren ;)

    Und wir reden ja hier von

    mattik schrieb:

    Deklaration


    Amin Negm-Awad schrieb:


    Daher die Beispiel für den *Type*-Name, die etwa

    int *

    enthalten.


    'int *' ist natürlich 'type-name', der enthält keinen. Zerlegt gibt das 'specifier-qualifier-list abstract-declarator', 'int' ist 'specifier-qualifier-list' und 'abstract-declarator' ist '*'

    Im Prinzip ist ein "Type name" eine Deklaration ohne Bezeichner:

    ISO/IEC 9899:1999 schrieb:


    In several contexts, it is necessary to specify a type. This is accomplished using a type name, which is syntactically a declaration for a function or an object of that type that omits the identifier.


    Daraus zu folgern wo das Sternchen zu schreiben ist finde ich gewagt.

    Amin Negm-Awad schrieb:

    Bitte genauer zwischen Declarator und Type-Name unterscheiden.

    Gerne, keine Ursache. Ist ja nun oben aufgeklärt, wir haben ja hier von Deklaratoren geredet.
  • Die Ursache scheint mir nicht aufgeklärt. Liegt allerdings am Lesen. Noch einmal:

    "Daher die Beispiel für den *Type*-Name, die etwa

    int *

    enthalten."

    Um das klarzustellen: Die Beispiele enthalten den Typnamen int *, nicht der Typname enthält int *. Genau das sage ich die gesamte Zeit: "int *" /ist/ der Typname, einschließlich *". Schön, dass du das jetzt auch einsiehst. Daher dürfte es dann ja aufgeklärt sein, dass das Sternchen zum Typnamen gehört. Stellt sich nur die Frage, warum du dem eigentlich nicht anders lautenden Beitrag von mattik widersprochen hast.

    Ein Typname ist auch nicht eine Deklaration ohne Bezeichner. Das steht da auch nicht. Da steht, dass /syntaktisch/ diese Regel gilt.

    Ein Typname wird aber auch an anderen Stellen benötigt. Es ist ein völlig eigenständiges Konstrukt (weshalb es ein völlig eigenständiges Unterkapitel im Standard erhalten hat) das im Falle einer Deklaration Bestandteil des anderen Konstruktes Deklaration ist. Im Falle eines Castings ist ein Typname Bestandteil eines Ausdruckes. Dennoch ist es ebenso Humbug zu sagen, dass ein Typname ein Casting nur ohne Klammern sei, bloß weil das syntaktisch so ist.

    Weil es aber auch an anderer Stelle auftaucht, zeigt sich leicht, dass das Sternchen Teil des Typnamens ist. Und genau das sage ich seit geraumer Zeit. Soll ich es dir noch einmal herausuchen?

    "* Der Typname laut Standard ist "int *" Spricht für mattik."
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Amin Negm-Awad ()

  • Ich glaube der Widerstpruch ging in erster Linie gegen mein vereinfachtes "<typ> <name>". Das ist in der Spec natürlich detaillier aufgedröselt. Darum ging es mir auch gar nicht, sondern um das angenommene Leseverständnis eines Menschen, der sich sowas ansieht - und da ging meine Argumentation in genau die Richtung: Das Sternchen gehört zum Typnamen. Dass ich nicht auf die Spezifikation hinauswollte, hatte ich mit dem "vereinfacht in etwa so" angedeutet.

    Ich finde es total beeindruckend, wie tief ihr die Spec auseinandergenommen habt. Ich glaube allerdings nicht, dass die Spec dafür geeignet ist, eine solche Stilfrage zu klären. Die erklärt, was formal korrekt ist und welche Semantik sowas dann hat. Formal und semantisch sind offensichtlich beide Alternativen ok.

    Ist schon toll: Der längste Thread hier seit Wochen geht um die Frage, ob ein Leerzeichen vor oder nach einem Sternchen hübscher ist...
    Multigrad - 360°-Produktfotografie für den Mac
  • Amin Negm-Awad schrieb:


    Ein Typname wird aber auch an anderen Stellen benötigt. Es ist ein völlig eigenständiges Konstrukt (weshalb es ein völlig eigenständiges Unterkapitel im Standard erhalten hat)


    Genau, ein Typname ist etwas Eigenständiges. Wir reden hier aber von Deklarationen. ;)

    Amin Negm-Awad schrieb:


    das im Falle einer Deklaration Bestandteil des anderen Konstruktes Deklaration ist.


    Ah, da liegt das Verständnisproblem. Ein Typname ist nie Bestandteil einer Deklaration, das geht syntaktisch gar nicht.

    Amin Negm-Awad schrieb:


    Weil es aber auch an anderer Stelle auftaucht, zeigt sich leicht, dass das Sternchen Teil des Typnamens ist.


    Das Sternchen ist beim Typnamen 'int (*)[3]' Teil des Typnames, bei der Deklaration 'int (*p)[3]'' Teil der Deklaration, das ist klar. Nur kommt der Typname nie in der Deklaration vor (auch wenn er eine abstrakte Deklaration ohne den Bezeichner ist), also kann man nicht folgern wo ein Leerzeichen hinzugehören habe.

    mattik schrieb:

    Ich glaube der Widerstpruch ging in erster Linie gegen mein vereinfachtes "<typ> <name>". Das ist in der Spec natürlich detaillier aufgedröselt. Darum ging es mir auch gar nicht, sondern um das angenommene Leseverständnis eines Menschen, der sich sowas ansieht - und da ging meine Argumentation in genau die Richtung: Das Sternchen gehört zum Typnamen. Dass ich nicht auf die Spezifikation hinauswollte, hatte ich mit dem "vereinfacht in etwa so" angedeutet.


    Das Problem daran ist das der Typname nicht in der Deklaration vorkommt. Wer sich also der "vereinfachten Leseweise" anschließt fragt sich dann bei 'int a[5]' wo denn nun der Typname ist? 'int [5]' würde ja heißen ich sollte 'int[5] a' schreiben...

    mattik schrieb:

    Ist schon toll: Der längste Thread hier seit Wochen geht um die Frage, ob ein Leerzeichen vor oder nach einem Sternchen hübscher ist...


    Wo das Leerzeichen hingehört ist eine Stilfrage, wie du selber geschrieben hast. Ich wollte nur die Verschwurbelung von Deklarationen und Typnamen verhindern, sonst bist du spätestens bei Blocks verwirrt. :|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von SteveJ ()