Beachten Sie, dass diese Frage ursprünglich im Jahr 2009 gestellt wurde, bevor C ++ 11 ratifiziert wurde und bevor die Bedeutung des
auto
Schlüsselworts drastisch geändert wurde. Die Antworten beziehen sich nur auf die C ++ 03-Bedeutung vonauto
- das ist eine spezifizierte Speicherklasse - und nicht auf die C ++ 11-Bedeutung vonauto
- das ist die automatische Typableitung. Wenn Sie nach Ratschlägen zur Verwendung von C ++ 11 suchenauto
, ist diese Frage für diese Frage nicht relevant.
Für die längste Zeit dachte ich, es gäbe keinen Grund, das static
Schlüsselwort in C zu verwenden, da Variablen, die außerhalb des Blockbereichs deklariert wurden, implizit global waren. Dann entdeckte ich, dass das Deklarieren einer Variablen als static
innerhalb des Blockbereichs eine dauerhafte Dauer und das Deklarieren außerhalb des Blockbereichs (im Programmbereich) einen Dateibereich ergeben würde (auf den nur in dieser Kompilierungseinheit zugegriffen werden kann).
Ich habe also nur ein Schlüsselwort, das ich (vielleicht) noch nicht vollständig verstehe: Das auto
Schlüsselwort. Gibt es eine andere Bedeutung als "lokale Variable"? Gibt es etwas, das nicht implizit für Sie erledigt wird, wo immer Sie es verwenden möchten? Wie verhält sich eine auto
Variable im Programmumfang? Was ist mit einer static auto
Variablen im Dateibereich? Hat dieses Schlüsselwort einen anderen Zweck als nur der Vollständigkeit halber?
Hat in C ++ 11
auto
eine neue Bedeutung: Sie können den Typ einer Variablen automatisch ableiten.Warum ist das jemals nützlich? Betrachten wir ein grundlegendes Beispiel:
Das
auto
dort erstellt einen Iterator vom Typstd::list<int>::iterator
.Dies kann das Lesen von sehr komplexem Code erheblich erleichtern.
Ein anderes Beispiel:
Dort wurde der
auto
Typ abgeleitet, der zum Speichern eines Lambda-Ausdrucks in einer Variablen erforderlich ist. Wikipedia hat eine gute Berichterstattung zu diesem Thema.quelle
const auto it = a.begin();
würde dir eine Konstante gebeniterator
, keineconst_iterator
. Sie könnten das Element noch ändern, aber++it
nicht kompilieren. Um eine zu bekommenconst_iterator
, würden Sie verwendenauto it = a.cbegin();
Das Schlüsselwort auto hat derzeit keinen Zweck. Sie haben genau Recht, dass nur die Standardspeicherklasse einer lokalen Variablen angepasst wird. Die wirklich nützliche Alternative ist
static
.Es hat eine brandneue Bedeutung in C ++ 0x. Das gibt Ihnen eine Vorstellung davon, wie nutzlos es war!
quelle
GCC wird speziell
auto
für verschachtelte Funktionen verwendet - siehe hier .Wenn Sie eine verschachtelte Funktion haben, die Sie vor ihrer Definition aufrufen möchten, müssen Sie sie mit deklarieren
auto
.quelle
"auto" soll den Compiler anweisen, selbst zu entscheiden, wo die Variable (Speicher oder Register) abgelegt werden soll. Sein Analogon ist "register", was den Compiler angeblich anweist, zu versuchen, es in einem Register zu halten. Moderne Compiler ignorieren beide, also sollten Sie auch.
quelle
Ich verwende dieses Schlüsselwort, um explizit zu dokumentieren, wenn es für die Funktion kritisch ist, dass die Variable für stapelbasierte Prozessoren auf dem Stapel platziert wird. Diese Funktion kann erforderlich sein, wenn der Stapel geändert wird, bevor von einer Funktion (oder einer Interrupt-Serviceroutine) zurückgekehrt wird. In diesem Fall erkläre ich:
Und dann greife ich außerhalb der Variablen zu:
Das
auto
Schlüsselwort hilft also, die Absicht zu dokumentieren.quelle
Laut Stroustrup hat die Verwendung von 'auto' in "The C Programming Language" (4. Ausgabe, C 11) folgende Hauptgründe (Abschnitt 2.2.2) (Stroustrup-Wörter werden zitiert):
1)
Mit 'auto' und dem notwendigen Initialisierer können wir den Variablentyp auf einen Blick erkennen!
2)
Meiner Meinung nach ist ein Fall, der hierher passt, ungefähr so:
3)
Stellen Sie sich einen langen Typnamen aus einem Iterator mit Vorlagen vor:
(Code aus Abschnitt 6.3.6.1)
quelle
Im alten Compiler war auto eine Möglichkeit, eine lokale Variable überhaupt zu deklarieren. Sie können lokale Variablen in alten Compilern wie Turbo C nicht ohne das Schlüsselwort auto oder ähnliches deklarieren.
quelle
Die neue Bedeutung des Auto - Schlüsselwort in C ++ 0x ist sehr schön beschrieben von Microsofts Stephan T. Lavavej in einem frei sichtbaren / herunterladbare Video Vortrag über STL auf MSDN Channel 9 Website gefunden hier .
Die Vorlesung ist in ihrer Gesamtheit sehenswert, aber der Teil über das Auto-Schlüsselwort befindet sich ungefähr in der 29. Minute (ungefähr).
quelle
Gibt es eine andere Bedeutung für "auto" als "lokale Variable"?
Nicht in C ++ 03.
Gibt es etwas, das nicht implizit für Sie erledigt wird, wo immer Sie es verwenden möchten?
Nichts in C ++ 03.
Wie verhält sich eine automatische Variable im Programmbereich? Was ist mit einer statischen automatischen Variablen im Dateibereich?
Schlüsselwort außerhalb eines Funktions- / Methodenkörpers nicht zulässig.
Hat dieses Schlüsselwort einen anderen Zweck [in C ++ 03] als nur der Vollständigkeit halber?
Überraschenderweise ja. Zu den C ++ - Entwurfskriterien gehörte ein hohes Maß an Abwärtskompatibilität mit C. C hatte dieses Schlüsselwort und es gab keinen wirklichen Grund, es zu verbieten oder seine Bedeutung in C ++ neu zu definieren. Der Zweck war also eine Inkompatibilität weniger mit C.
Hat dieses Schlüsselwort in C einen anderen Zweck als nur der Vollständigkeit halber?
Ich habe erst kürzlich eines gelernt: Die einfache Portierung alter Programme aus B. C entwickelte sich aus einer Sprache namens B, deren Syntax der von C ziemlich ähnlich war. B hatte jedoch keinerlei Typen. Die einzige Möglichkeit, eine Variable in B zu deklarieren, bestand darin, ihren Speichertyp (
auto
oderextern
) anzugeben . So was:Diese Syntax funktioniert immer noch in C und entspricht
In C wird standardmäßig die Speicherklasse und standardmäßig
auto
der Typ verwendetint
. Ich denke, dass jedes einzelne Programm, das aus B stammte und nach C portiert wurdeauto
, zu dieser Zeit buchstäblich voller Variablen war.In C ++ 03 ist das implizite int des C-Stils nicht mehr zulässig, das nicht mehr genau nützliche
auto
Schlüsselwort wurde jedoch beibehalten, da im Gegensatz zum impliziten int keine Probleme mit der Syntax von C verursacht wurden.quelle