Warum ist ‘T *name’ als C-Weg und ‘T* name’ als C++-Weg gedacht?

Lesezeit: 8 Minuten

Benutzer-Avatar
Xeo

Hinweis: Bei dieser Frage geht es um die Position des Sternchens (*).

In den meisten C-Codes, die ich sehe (z. B. in Beejs Leitfaden zur Netzwerkprogrammierung), verwenden alle Variablendeklarationen/-definitionen die T *name formatieren, dh binden * zum Variablennamen. Es wird angenommen, dass der Zeiger zur Variablen gehört, nicht zum Typ.

In den meisten C++-Codes, die ich sehe, ist das Format T* namedh es bindet die * zum Typ der Variablen . Es wird angenommen, dass der Zeiger zum Typ gehört, nicht zur Variablen. Ich selbst verwende als reiner C++-Coder dieses Format auch als Zeiger auf Typ gehört eindeutig (für mich) zum Typ, nicht zur Variable. (Übrigens verwendet sogar der C++-Standard dieses Format in den Beispielen. 🙂 )

Gibt es dafür einen (historischen) Grund? Hat sich die Denkweise gerade geändert, als Programmierer anfingen, C++ zu machen?

Es wäre auch schön, wenn ein C-Codierer (der das erstere Format verwendet) erklären könnte, warum er es verwendet und nicht das letztere.

  • Aus Neugier, wie schreibt man “Zeiger auf zurückkehrende Funktion T“? Nur Fragen.

    – Nemo

    23. Juni 2011 um 6:15 Uhr

  • Ich denke int *a, *b vs int* a, b ist der Grund, warum einige ersteres bevorzugen

    – Irgendein Korn

    23. Juni 2011 um 6:17 Uhr

  • @nemo: std::identity<T (*)()>::type pf;. 😛 Natürlich typedef T (*pf_type)(); pf_type pf;aber das liegt nur an den Parsing-Regeln.

    – Xeo

    23. Juni 2011 um 6:18 Uhr

  • @Anycorn: Ich kaufe dieses Argument nicht – niemand schreibt Code wie Ihr zweites Beispiel. Das ist genauso schlimm wie das Argument “Füge immer Klammern zu IF-Anweisungen hinzu, weil wir davon ausgehen, dass der nächste Typ zu dumm ist, sie hinzuzufügen”.

    – Billy ONeal

    23. Juni 2011 um 6:25 Uhr


  • @billy Ich bin verwirrt, warum Sie Anycorn sagen, dass sein Standpunkt kein Thema ist, wenn Sie in Ihrer Antwort genau denselben Standpunkt vertreten wie er!

    – Bill Förster

    23. Juni 2011 um 6:31 Uhr

Benutzer-Avatar
Allmächtig

Wenn ich eine Vermutung wagen sollte, würde ich sagen, dass dies daran liegt, dass C++-Leute Typinformationen eher als eine Sache an sich betrachten, da Templates es ermöglichen, Typen während der Kompilierung programmatisch zu manipulieren. Es ist auch viel unwahrscheinlicher, dass sie mehrere Variablen in derselben Deklaration deklarieren.

Das T* Stil konzentriert die Typinformationen an einer Stelle und hebt sie hervor, und die Verwirrung, die durch etwas wie eingeführt würde T* foo, bar; mit dieser Syntax ist kein Problem, wenn Sie niemals zwei Variablen in derselben Anweisung deklarieren.

Ich persönlich finde die T* Stil, um wirklich unausstehlich zu sein und es immens zu hassen. Das * ist zwar Teil der Typinformationen, aber die Art und Weise, wie der Compiler sie analysiert, macht sie tatsächlich an den Namen und nicht an den Typ angehängt. Ich denke, die T* Weg verdeckt etwas Wichtiges, das passiert.

Meinen Beobachtungen nach scheine ich eine Seltenheit in der C++-Community zu sein. Mir ist dasselbe aufgefallen wie Sie, was den beliebtesten Stil betrifft.

Um es klar zu sagen: Beide Stile funktionieren natürlich in beiden Sprachen. Aber ich bemerke dasselbe wie Sie, dass ein Stil bei C-Code etwas häufiger vorkommt und der andere eher bei C++.

  • +1 Die T* wirklich beabsichtigt, die zu qualifizieren Typ und nicht die Variable. Um die Verwirrung zu vermeiden T* foo, bar; Ich deklariere sie gesondert.

    – Benutzer703016

    23. Juni 2011 um 6:21 Uhr

  • Wenn Sie denken, dass der Code wegen der Platzierung des Sternchens “unangenehm” ist, dann machen Sie sich meiner Meinung nach die falschen Sorgen.

    – Billy ONeal

    23. Juni 2011 um 6:28 Uhr

  • Das Deklarieren mehrerer Variablen in derselben Zeile erschwert das Lesen des Codes, unabhängig davon, ob es sich um Zeiger handelt oder nicht. Tun Sie das nicht: Sie müssen wirklich nicht den HD-Speicherplatz speichern, auf dem Ihr Quellcode gespeichert ist, wie dies in den 70er Jahren der Fall war. Wenn dies der einzige Grund ist, warum Leute das * neben den Variablennamen setzen, ist es ein wirklich schlechter.

    – Ludin

    23. Juni 2011 um 6:29 Uhr

  • Bei der Verwendung von Vorlagen werden die Typen wichtiger. MyClass<T> und MyClass<T*> sind ganz anders.

    – Bo Persson

    23. Juni 2011 um 7:08 Uhr


  • “Das * ist Teil der Typinformationen, das stimmt, aber die Art und Weise, wie der Compiler es analysiert, macht es tatsächlich an den Namen gebunden, nicht an den Typ. Ich denke, der T*-Weg verschleiert etwas Wichtiges, das passiert.” Um den Compiler brauchen Sie sich keine Gedanken zu machen. Der Compiler wird in Ordnung sein. Optimieren Sie Ihren Codestil für Menschen, nicht für den Compiler. Trotzdem +1 von mir für eine großartige Antwort, die das Herz des berührt tatsächlich Frage gut (trotz Ihrer kurzen Tangente in die persönliche Meinung: P)

    – Leichtigkeitsrennen im Orbit

    23. Juni 2011 um 8:51 Uhr


Benutzer-Avatar
NRSSowrabh

Aus Häufig gestellte Fragen zu Stil und Technik von Stroustrup zu C++.

Ein “typischer C-Programmierer” schreibt int *p; und erklärt es“*p ist was ist das int” betont die Syntax und kann auf die Deklarationsgrammatik von C (und C++) verweisen, um für die Korrektheit des Stils zu argumentieren * bindet sich an den Namen p in der Grammatik.

Ein “typischer C++-Programmierer” schreibt int* p; und erklärt es“p ist ein Zeiger auf ein int” Hervorhebung des Typs. In der Tat der Typ von p ist int*. Ich bevorzuge eindeutig diese Betonung und sehe sie als wichtig an, um die fortgeschritteneren Teile von C++ gut zu nutzen.

  • Ich stimme zu, dass dies eine geringfügig bessere Antwort ist als meine, obwohl sie ungefähr dasselbe mit einer subtiler ausgedrückten Meinungsverzerrung sagt (aber zumindest ist es die Meinungsverzerrung einer berühmten Person, und ich denke, das zählt irgendwie). Aber ich werde sagen, dass mir dieses Stroustrup-Zitat nicht bewusst war, als ich meine Antwort schrieb. Es ist also amüsant, dass wir beide im Grunde dasselbe gesagt haben.

    – Allmächtig

    24. Juni 2011 um 22:42 Uhr

  • Ich mag diese Antwort, weil Sie nicht versuchen, sie mit Ihrer eigenen Meinung zu rechtfertigen. Sie wenden sich stattdessen an jemanden, der mehr oder weniger eine Autorität auf diesem Gebiet ist.

    – Tim Seguine

    27. Februar 2014 um 9:57 Uhr

Persönlich würde ich dem nicht zustimmen – ich glaube nicht, dass es eine C- oder C++-Methode gibt, dies zu tun. Ich habe noch nie Beweise gesehen, die darauf hindeuten. Ich habe jedoch eine Hypothese, warum die Syntax mit dem Sternchen näher am deklarierten Variablennamen in C.

In C (zumindest in C89, der überwiegenden Mehrheit von C) müssen Sie alle Ihre Variablen am Anfang eines Blocks deklarieren. Dies führt dazu, dass Programmierer etwas tun

T a, b, c;

relativ oft, während dies in C++ selten vorkommt. (In C++ deklarieren Sie Variablen in der Nähe ihrer Verwendung, und Variablen haben oft Konstruktorparameter usw. Daher ist es selten, mehrere Objekte in einer einzelnen Zeile zu deklarieren.)

Dies ist auch der einzige Fall, in dem die Syntax von Bedeutung ist, da die Anweisung

T* a, b, c;

deklariert einen Zeiger, anstatt der drei, die der Programmierer vielleicht erwarten würde.

Da es in C häufiger vorkommt, mehr als eine Deklaration in eine einzelne Zeile zu schreiben, und auch der einzige Fall ist, in dem die Position des Sternchens eine Rolle spielt, ist es für den Programmierer wahrscheinlicher, das Sternchen mit der Variablen zu verknüpfen.

Allerdings habe ich noch nie Beweise dafür gesehen – das ist nur eine Vermutung.

  • Aus Erfahrung habe ich einen deutlichen Unterschied zwischen C- und C++-Quellen gesehen. Ich habe zum Beispiel noch nie gesehen T* var in einem C-Code. Und die meisten C++, die ich gelesen habe, verwendeten die T* var Stil statt T *var.

    – Benutzer703016

    23. Juni 2011 um 7:20 Uhr

  • @Cicada: Ich sehe viele von beidem in beiden Sprachen.

    – Billy ONeal

    23. Juni 2011 um 7:21 Uhr

Ein paar Leute erwähnten sehr gute Punkte. Ich möchte nur darauf hinweisen, dass C++ zwar die Bedeutung „Deklaration spiegelt die Verwendung wider“ sehr stark beibehalten hat, C++ jedoch nicht. Mehrere Deklaratoren in C++ spiegeln die Verwendung in Deklarationen nicht wider;

int &ref; // but "&ref" has type "int*", not "int".
int &&ref; // but "&&ref" is not valid at all.

Ich glaube nicht, dass C++-Programmierer, die es anders schreiben, dies tatsächlich als Grund haben, aber es könnte etwas sein, das C++-Buchautoren daran hindert, es zu erwähnen, was diese C++-Programmierer beeinflussen kann.

Der Grund, warum C-Programmierer dazu neigen, einen Stil zu verwenden, während C++-Programmierer den anderen Stil verwenden, ist ganz einfach: Kernighan & Ritchie verwendeten den “C-Stil” in ihr Buchwährend Stroustrup den “C++-Stil” in verwendet hat seine Buchen.

  • Dies. Außerdem beschreibt Stroustrup das eine ausdrücklich als mehr C-ähnlich und das andere eher als C++-ähnlich, und warum er das so denkt, hier

    – Steve Jessop

    23. Juni 2011 um 10:27 Uhr


Benutzer-Avatar
wenigadv

Bei K&R verwenden sie die type *name Notation, also könnten viele C-Programmierer darauf gekommen sein.

  • Dies. Außerdem beschreibt Stroustrup das eine ausdrücklich als mehr C-ähnlich und das andere eher als C++-ähnlich, und warum er das so denkt, hier

    – Steve Jessop

    23. Juni 2011 um 10:27 Uhr


Benutzer-Avatar
fredoverflow

Weil Bjarne im Nachhinein den Vorteil hatte: Er erkannte, dass die C-Deklarationssyntax “ein Experiment war, das fehlschlug” (sprich: Die C-Deklarationssyntax ist verzögert). Der Rest wurde bereits von anderen beantwortet.

  • @Tomalak: Sicher, Abwärtskompatibilität 🙁

    – fredoverflow

    23. Juni 2011 um 18:04 Uhr

  • Es wäre schön, wenn das so wäre auto name -> type von Funktionen könnte zu Variablen übergehen, was es weniger hässlich und einfacher zu analysieren macht, denke ich.

    – Xeo

    24. Juni 2011 um 0:41 Uhr

  • @FredOverflow Aber es gab keine Abwärtskompatibilitätsanforderung für Verweise, dennoch kopierte C++ die Zeigersyntax. =(

    – jamesdlin

    26. Februar 2014 um 11:08 Uhr

1146120cookie-checkWarum ist ‘T *name’ als C-Weg und ‘T* name’ als C++-Weg gedacht?

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

Privacy policy