In meinen College-Tagen habe ich über das auto
Schlüsselwort gelesen und im Laufe der Zeit tatsächlich vergessen, was es ist. Es ist definiert als:
definiert eine lokale Variable als lokal variabel
Ich habe nie festgestellt, dass es irgendwo verwendet wird, wird es wirklich verwendet und wenn ja, wo wird es verwendet und in welchen Fällen?
auto
kann , der jedoch nicht standardmäßig auftritt?auto
. tigcc.ticalc.org/doc/keywords.html#auto_Thread_local
Details: en.cppreference.com/w/c/language/storage_duration und stackoverflow.com/a/14289720/6557621Wenn Sie die IAQ- Liste (Infrequently Asked Questions) gelesen haben , wissen Sie, dass auto in erster Linie nützlich ist, um ein Fahrzeug zu definieren oder zu deklarieren:
Ein Fahrzeug, das konsequent im Freien geparkt wird:
Für diejenigen, die keinen Sinn für Humor haben und "nur die Fakten Ma'am" wollen: Die kurze Antwort lautet, dass es keinen Grund gibt, überhaupt etwas zu verwenden
auto
. Sie dürfen nurauto
eine Variable verwenden, die bereits über eineauto
Speicherklasse verfügt. Sie geben also nur etwas an, das sowieso passieren würde. Wenn Sie versuchen,auto
eine Variable zu verwenden, für die dieauto
Speicherklasse noch nicht vorhanden ist, lehnt der Compiler Ihren Code ab. Ich nehme an, wenn Sie technisch werden möchten, muss Ihre Implementierung kein Compiler sein (aber es ist) und sie kann den Code theoretisch nach dem Ausstellen einer Diagnose weiter kompilieren (wird es aber nicht).Kleiner Nachtrag von kaz :
Es gibt auch:
Dies erfordert eine Diagnose gemäß ISO C. Dies ist richtig, da es erklärt, dass das Auto eine Panne hat. Die Diagnose ist kostenlos, aber das Ausschalten der Armaturenbrettbeleuchtung kostet Sie achtzig Dollar. (20 oder weniger, wenn Sie Ihren eigenen USB-Dongle für die On-Board-Diagnose bei eBay kaufen).
Das oben Genannte
extern auto my_car
erfordert auch eine Diagnose, und aus diesem Grund wird es nie durch den Compiler ausgeführt, außer von städtischen Mitarbeitern, die mit der Parküberwachung beauftragt sind.Wenn Sie
extern static auto ...
in einer Codebasis viel sehen , befinden Sie sich in einer schlechten Nachbarschaft. Suchen Sie sofort nach einem besseren Job, bevor sich der ganze Ort Rust zuwendet.quelle
char auto my_car;
Das
auto
Schlüsselwort ist in der C-Sprache nutzlos. Es ist da, weil es vor der C-Sprache eine B-Sprache gab, in der dieses Schlüsselwort für die Deklaration lokaler Variablen erforderlich war. (B wurde zu NB entwickelt, was zu C wurde).Hier ist das Referenzhandbuch für B .
Wie Sie sehen können, enthält das Handbuch zahlreiche Beispiele, in denen
auto
verwendet wird. Dies liegt daran, dass keinint
Schlüsselwort vorhanden ist. Es wird eine Art Schlüsselwort benötigt, um zu sagen, dass dies eine Deklaration einer Variablen ist, und dieses Schlüsselwort gibt auch an, ob es sich um eine lokale oder eine externe Variable handelt (auto
versusextrn
). Wenn Sie das eine oder andere nicht verwenden, liegt ein Syntaxfehler vor. Das heißt,x, y;
ist keine Erklärung für sich, sondernauto x, y;
ist.Da in B geschriebene Codebasen bei der Entwicklung der Sprache nach NB und C portiert werden mussten, enthielten die neueren Versionen der Sprache etwas Gepäck für eine verbesserte Abwärtskompatibilität, was zu weniger Arbeit führte. Im Fall von
auto
mussten die Programmierer nicht jedes Vorkommen aufspürenauto
und entfernen.Aus dem Handbuch geht hervor, dass die mittlerweile veraltete "implizite int" -Kruft in C (die in der Lage ist,
main() { ... }
ohneint
Front zu schreiben ) ebenfalls von B stammt. Dies ist eine weitere Abwärtskompatibilitätsfunktion zur Unterstützung von B-Code. Für Funktionen ist in B kein Rückgabetyp angegeben, da keine Typen vorhanden sind. Alles ist ein Wort, wie in vielen Assemblersprachen.Beachten Sie, wie eine Funktion nur deklariert werden kann
extrn putchar
und dann das einzige, was sie zu einer Funktion macht, die der Bezeichner verwendet : Sie wird in einem Funktionsaufrufausdruck wie verwendetputchar(x)
, und das sagt dem Compiler, dass er dieses typenlose Wort als Funktionszeiger behandeln soll.quelle
In C
auto
ist ein Schlüsselwort, das angibt, dass eine Variable für einen Block lokal ist. Da dies die Standardeinstellung für Variablen mit Blockbereich ist, ist sie unnötig und wird sehr selten verwendet (ich glaube nicht, dass ich sie jemals außerhalb von Beispielen in Texten gesehen habe, in denen das Schlüsselwort behandelt wird). Es würde mich interessieren, ob jemand auf einen Fall hinweisen könnte, in dem die Verwendung vonauto
erforderlich war, um eine korrekte Analyse oder ein korrektes Verhalten zu erzielen.Im C ++ 11-Standard wurde das
auto
Schlüsselwort jedoch zur Unterstützung der Typinferenz "entführt", wobei der Typ einer Variablen dem Typ ihres Initialisierers entnommen werden kann:Typinferenz wird hauptsächlich hinzugefügt, um das Deklarieren von Variablen in Vorlagen zu unterstützen oder von Vorlagenfunktionen zurückgegeben zu werden, bei denen das manuelle Deklarieren von Typen, die auf einem Vorlagenparameter basieren (oder vom Compiler abgeleitet werden, wenn eine Vorlage instanziiert wird), oft sehr schmerzhaft sein kann.
quelle
auto
handelt von einer Speicherklasse, die nichts mit Sichtbarkeit zu tun hat.Mit dem alten Aztec C-Compiler war es möglich, alle automatischen Variablen mithilfe eines Befehlszeilenschalters in statische Variablen umzuwandeln (um die Adressierungsgeschwindigkeit zu erhöhen).
auto
In diesem Fall wurden explizit mit deklarierte Variablen unverändert gelassen. (Ein Muss für rekursive Funktionen, die sonst nicht richtig funktionieren würden!)quelle
Das
auto
Schlüsselwort ähnelt dem Einfügen von Semikolons in Python. Es wurde von einer früheren Sprache (B
) benötigt, aber die Entwickler erkannten, dass es redundant war, da die meisten Dinge vorhanden warenauto
.Ich vermute, es wurde gelassen, um beim Übergang von B nach C zu helfen. Kurz gesagt, eine Verwendung ist die Kompatibilität der B-Sprache.
Zum Beispiel in B und 80er C:
quelle
Das Auto-Schlüsselwort ist ein Beispiel für eine Speicherklasse (eine Art von Techniken, die die Lebensdauer der Variablen und des Speicherorts bestimmen). Es hat ein Verhalten, bei dem Variablen, die mithilfe der Hilfe dieses Schlüsselworts erstellt wurden, die Lebensdauer (Lebensdauer) nur in geschweiften Klammern haben
quelle
auto
kann nur für Variablen mit Blockbereich verwendet werden.extern auto int
ist Müll, weil der Compiler nicht bestimmen kann, ob dies eine externe Definition verwendet oder ob das Externe mit einer Auto-Definition überschrieben werden soll (auch Auto und Extern sind völlig unterschiedliche Speicherdauern, wiestatic auto int
, was natürlich auch Müll ist). Es könnte sich immer dafür entscheiden, es in eine Richtung zu interpretieren, sondern es stattdessen als Fehler zu behandeln.Es gibt eine Funktion,
auto
die die Regel "Alles ist ein Int" innerhalb einer Funktion aktiviert. Anders als außerhalb einer Funktion, woa=3
sie als Definition interpretiert wird,int a =3
weil Zuweisungen im Dateibereich nicht vorhanden sind,a=3
ist dies ein Fehler innerhalb einer Funktion, da der Compiler sie anscheinend immer als Zuweisung zu einer externen Variablen und nicht als Definition interpretiert (selbst wenn vorhanden) sind keineextern int a
Vorwärtsdeklarationen in der Funktion oder in der Datei scope), sondern ein Spezifizierer wiestatic
,const
,volatile
oderauto
würde bedeuten , dass es sich um eine Definition und der Compiler nimmt , ist es als eine Definition, mit der Ausnahmeauto
nicht die Nebenwirkungen der anderen Planer hat.auto a=3
ist daher implizitauto int a = 3
. Freilich,signed a = 3
hat den gleichen Effekt undunsigned a = 3
ist immer ein int ohne Vorzeichen.Beachten Sie auch: "
auto
Hat keinen Einfluss darauf, ob ein Objekt einem Register zugewiesen wird (es sei denn, ein bestimmter Compiler beachtet es, aber das scheint unwahrscheinlich)."quelle
Ich bin sicher, dass Sie mit Speicherklassenspezifizierern in C vertraut sind, die "extern", "statisch", "register" und "auto" sind. Die Definition von "auto" wird in anderen Antworten ziemlich häufig angegeben, aber hier ist eine mögliche Verwendung des Schlüsselworts "auto", die ich nicht sicher bin, aber ich denke, dass sie vom Compiler abhängig ist. Sie sehen, in Bezug auf Speicherklassenspezifizierer gibt es eine Regel. Wir können nicht mehrere Speicherklassenspezifizierer für eine Variable verwenden. Aus diesem Grund können statische globale Variablen nicht extern bereitgestellt werden. Daher sind sie nur ihrer Datei bekannt. Wenn Sie zu Ihrer Compilereinstellung gehen, können Sie das Optimierungsflag für die Geschwindigkeit aktivieren. Eine der Möglichkeiten, die der Compiler optimiert, ist: Es sucht nach Variablen ohne Speicherklassenspezifizierer und führt dann eine Bewertung basierend auf der Verfügbarkeit des Cache-Speichers und einigen anderen Faktoren durch, um festzustellen, ob diese Variable mit dem Registerspezifizierer behandelt werden soll oder nicht. Was ist nun, wenn wir unseren Code auf Geschwindigkeit optimieren möchten, während wir wissen, dass eine bestimmte Variable in unserem Programm nicht sehr wichtig ist und wir nicht möchten, dass der Compiler sie überhaupt als Register betrachtet. Wenn Sie jedoch auto setzen, kann der Compiler einer Variablen keinen Registerspezifizierer hinzufügen, da Sie "register auto int a" eingeben. ODER "Auto Register Int Int;" löst den Fehler aus, mehrere Speicherklassenspezifizierer zu verwenden. Zusammenfassend dachte ich, dass Auto dem Compiler verbieten kann, eine Variable durch Optimierung als Register zu behandeln. Was ist, wenn wir unseren Code auf Geschwindigkeit optimieren möchten, während wir wissen, dass eine bestimmte Variable in unserem Programm nicht sehr wichtig ist und wir nicht möchten, dass der Compiler sie überhaupt als Register betrachtet? Wenn Sie jedoch auto setzen, kann der Compiler einer Variablen keinen Registerspezifizierer hinzufügen, da Sie "register auto int a" eingeben. ODER "Auto Register Int Int;" löst den Fehler aus, mehrere Speicherklassenspezifizierer zu verwenden. Zusammenfassend dachte ich, dass Auto dem Compiler verbieten kann, eine Variable durch Optimierung als Register zu behandeln. Was ist, wenn wir unseren Code auf Geschwindigkeit optimieren möchten, während wir wissen, dass eine bestimmte Variable in unserem Programm nicht sehr wichtig ist und wir nicht möchten, dass der Compiler sie überhaupt als Register betrachtet? Wenn Sie jedoch auto setzen, kann der Compiler einer Variablen keinen Registerspezifizierer hinzufügen, da Sie "register auto int a" eingeben. ODER "Auto Register Int Int;" löst den Fehler aus, mehrere Speicherklassenspezifizierer zu verwenden. Zusammenfassend dachte ich, dass Auto dem Compiler verbieten kann, eine Variable durch Optimierung als Register zu behandeln. löst den Fehler aus, mehrere Speicherklassenspezifizierer zu verwenden. Zusammenfassend dachte ich, dass Auto dem Compiler verbieten kann, eine Variable durch Optimierung als Register zu behandeln. löst den Fehler aus, mehrere Speicherklassenspezifizierer zu verwenden. Zusammenfassend dachte ich, dass Auto dem Compiler verbieten kann, eine Variable durch Optimierung als Register zu behandeln.
Diese Theorie hat für den GCC-Compiler nicht funktioniert, ich habe jedoch keine anderen Compiler ausprobiert.
quelle