Dieses AUTO ist cool

Die Welt ist im Wandel

hieß schon am Beginn der Herr-der-Ringe Filme und das trifft auch auf unsere Welt(en) zu.

Während die Worte gleich bleiben ändert sich das, was damit bezeichnet wird, und schon haben wir ganz neue Möglichkeiten uns auszudrücken.

Das beste Beispiel dafür ist das Schlüsselwort auto, welches seit Urzeiten ungenutzt im C-Standard liegt und welches seit C++ 11 ein ganz neue Bedeutung erhalten hat.


In der klassischen C Welt gab bzw. gibt es 3 Formen von Datenelementen:

  • statische: das sind globale Variablen, die vom Programmbeginn an bis zum Ende an der gleichen Adresse verweilen.
  • dynamische: sie werden von der Speicherverwaltung ( malloc() ) auf Anfrage bereitgestellt und müssen auch manuell wieder freigegeben werden (free() )
  • automatische: das sind unsere lokalen Variablen und Funktionsparameter und diese werden automatisch relativ zur aktuell laufenden Funktionsparameter an einen bestimmten Ort (Stack gepackt.

Globale / statische Variablen

Für globale Variablen gibt es den Bezeichner static, vor allem wenn sie innerhalb von Funktionen deklariert werden. Außerhalb (also im globalen Namensraum) können sie auch den Bezeichner extern haben, wenn sie über Modulgrenzen hinweg (DLL/SO) sichtbar sein sollen.

 1/* visible global variable, accessible from everywhere */
 2extern int global_state = 1;
 3
 4/* global variable, accessible only in current .c file */
 5static int internal_state = 2;
 6
 7int my_function(int param)
 8{
 9  /* global variable only accessible in this function */
10  static int function_state = 3;
11}

Dynamische Variablen

Vereinfacht könnte sagen:

Alles, was bei seiner Erzeugung als Pointer entsteht, fällt in diese Kategorie.

Bei malloc() / free() angefangen bis hin zu nativen Funktion eines Betriebssystems bekommen wir stets einen Pointer, der auf die eigentlichen Daten zeigt.

Darauf brauchen wir hier nicht näher eingehen.

Automatische / lokale Variablen

Tja, aber die meisten Datenelemente liegen in lokalen Variablen innerhalb von Funktionen, und diese werden automatisch an einer Speicheradresse angelegt, die am Stack liegt und relativ zum aktuellen Funktionsrahmen (Stack-Frame) errechnet wird.

Und genau hier hatte der C Standard ein eigenes Schlüsselwort vorgesehen und das hieß auto.

Das C Schlüsselwort AUTO

Es war also vorgesehen, dass wir in Funktionen unseren Code in etwa so schreiben:

1int get_counter()
2{
3  static int global_counter = 1;
4  auto int current_count = ++global_counter;
5  return current_count;
6}

Jede lokale Variable hätte mit auto als eben solche identifiziert werden sollen.
Aber genau das ist überflüssig, denn wenn eine Variable nicht statisch ist, was sollte sie denn sonst sein?

Und so konnte man auto auch weglassen und nur
int current_count = ... schreiben um eine automatische Variable zu erhalten.

auto gelang somit in Vergessenheit bevor es noch bekannt wurde. Und ich kenne keinen verbreiteten C Code, der auto jemals eingesetzt hätte.

auto als Heilsbringer in C++

Aus genau diesem Grund erhielt auto im C++ Standard 2011 (C++11) eine neue Bedeutung:

Lässt man nach auto den Datentypen weg und es folgt der Variablennamen, so legt der Compiler automatisch den Datentypen fest.

Anstatt

1int x = 42;
2std::string y = my_stringstream.str();
3double* z = new double();

kann man nun:

1auto x = 42;
2auto y = my_stringstream.str();
3auto z = new double();

schreiben.

Und wie geil das für Templates ist … dazu schreib ich morgen was.