Die Erfinder der Programmiersprache C sind auch die Urväter der Hello-World-Programme. Was liegt also näher, als dass wir unseren ersten Einstieg in die C/C++ Programmierung ebenfalls mit einem Hello World! beginnen.

Wenn Sie den Anweisungen zum Einrichten einer Programmierumgebung genau gefolgt sind, dann sollten Sie auf Ihrem Computer nun einen Projektordner mit einer README Datei und einem Unterordner cgb_01 haben. Es sollte in Ihrem VSCode also wie folgt aussehen:

Wir widmen uns nun dem Unterordner cgb_01. In diesem Ordner erstellen wir unser erstes Programm. Hier erstellen wir zwei neue leere Dateien “makefile” und “main.c”. Wenn alles geklappt hat, sollte es nun bei Ihnen wie folgt aussehen:

main.c

Der folgende Programmcode kommt in die main.c Datei:

// Hello World in C

#include <stdio.h>

int main()
{
    printf("Hello World!\n");

    return 0;
}

Hier eine Erklärung der einzelnen Zeilen:

// Hello World in C
In C ist jede Zeile die mit // beginnt ein Kommentar. Kommentare erlauben es dem Entwickler, Notizen zu machen. So kann er selber, aber auch andere den Code besser verstehen. Der Compiler ignoriert diese Zeile komplett.

#include <stdio.h>
Mit Hilfe von #include Statements werden Funktionen aus anderen Bibliotheken oder Dateien in unser Programm hinzugeladen. Hier laden wir die Bibliothek stdio (kurz für Standard-Input-Output). Dies ist nötig damit wir später die Funktion printf nutzen können um Text im Terminal auszugeben.

int main()
Hier definieren wir die Funktion main. Ein C-Programm kann aus vielen Funktionen bestehen, benötigt aber mindestens eine Funktion mit dem Namen main. Dies ist der Einstiegspunkt unseres Programms und wird immer aufgerufen, wenn unser Programm startet. Der Parameter int vor dem Funktionsnamen gibt an, dass diese Funktion einen numerischen (int = Integer) Wert als Ergebnis zurück gibt.

printf(“Hello World!\n”);
Hier wird die Funktion printf aufgerufen. Es wird ein String als Parameter übergeben. Hiermit wird ein Text auf der Konsole ausgegeben. Das abschließende \n ist ein Zeilenumbruch damit der Cursor in die neue Zeile springt.

return 0;
Gibt 0 als Rückgabewert unserer main Funktion zurück. Dieser Rückgabewert ist wichtig. Hiermit teilen wir dem Betriebssystem mit, dass unser Programm keinen Fehler verursacht hat. Falls innerhalb unseres Programms ein Fehler auftritt, würden wir hier einen Wert ungleich 0 zurückgeben.

Kompilieren

Um das Programm auszuführen, muss es in Maschinencode übersetzt werden. Diesen Vorgang nennt man Kompilieren. Um unser Programm nun zu kompilieren wechseln wir in das Integrierte Terminal von Visual Studio Code. Klicken Sie dazu mit der rechten Maustaste auf den Ordner cgb_01 und wählen Sie “Open in Integrated Terminal”. Anschließend sollte das integrierte Terminal unten rechts aufgehen und bereits im Ordner cgb_01 sein.

Im Terminal können Sie nun die Kompilierung starten indem Sie den folgenden Befehl eingeben:

gcc -g src/main.c -o hello

Wenn alles geklappt hat, dann sollte nun eine neue Datei mit dem Namen hello in Ihrem Ordner auftauchen. Dies ist unser ausführbares Programm. Der -o Parameter im obigen Kommando gibt den Namen der Binärdatei an, die erstellt werden soll.

Um das Programm zu starten, tippen Sie nun folgendes in das Terminal ein:

./hello

Auf der Konsole sollte nun Hello World! erscheinen.

Makefile erstellen

Unser Befehl zum Kompilieren wird im Laufe dieses Kurses immer komplizierter. Das liegt daran, dass wir später noch weitere Bibliotheken hinzu laden müssen. Damit wir uns diesen Befehl nicht merken müssen und auch andere Dinge etwas leichter werden, nutzen wir ein Makefile.

Es gibt ein sehr gutes Video auf YouTube, in dem Makefiles erklärt werden. Schauen Sie sich das Video an und falls die Fragen haben, dann beantworte ich diese gerne im Plenum.

Für dieses Kapitel erhalten Sie von mir das fertige Makefile, mit der Bitte es genau so zu übernehmen. In zukünftigen Aufgaben gehe ich davon aus, dass Sie das Konzept verinnerlicht haben und eigenständig die nötigen Anpassungen vornehmen können.

Kopieren Sie den folgenden Inhalt in cgb_01/makefile:

bin/engine: obj/main.o bin
	gcc -g obj/*.o -o bin/engine

obj/main.o: src/main.c obj
	gcc -g -c main.c -o obj/main.o

bin:
	mkdir -p bin

obj: 
	mkdir -p obj

run: bin/engine
	bin/engine

clean:
	rm -rf obj
	rm -rf bin

Sie sehen, dass ich den Kompiliervorgang in 2 Schritte aufgeteilt habe. Zuerst wird eine .o Datei im Ordner obj erzeugt und anschließend eine Binärdatei im Order bin. Mit diesem Makefile haben wir nun 3 wichtige Kommandos zur Verfügung:

make
Kompiliert unser Programm und speichert die Binärdatei als bin/hello ab.

make run
Kompiliert unser Programm falls sich etwas am Code geändert hat und startet es direkt. Das nutzen wir zum Testen im Terminal.

make clean
Löscht alle Binärdateien und unnötigen Ordner. Das tun wir üblicherweise bevor wir das Projekt zippen oder gitten.

Testen Sie ob alle 3 Befehle korrekt funktionieren.

Lernziele

Mit dem Abschluss dieses Abschnitts sollten Sie in der Lage sein, einfache C Programme zu schreiben und zu kompilieren. Wenn Sie gefragt werden, können jede Zeile in unserem Hello World Programm erklären. Sie haben verstanden wie Makefiles aufgebaut sind und können jede Zeile in unserem Makefile erklären.