Warum ist âT *nameâ als C-Weg und âT* nameâ als C++-Weg gedacht?
Lesezeit: 8 Minuten
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
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)
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
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
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
11461200cookie-checkWarum ist âT *nameâ als C-Weg und âT* nameâ als C++-Weg gedacht?yes
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
vsint* 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ĂŒrlichtypedef 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