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