Compiler Präprozessor Header Files

Ähnliche Dokumente
8.1 Vom Quellcode zur ausführbaren Programm

Einführung Makros Includes Errors und Warnings Pragmas Diverses. Der C-Präprozessor. Lukas Stabe. Universität Hamburg

FACHHOCHSCHULE MANNHEIM

Programmierung mit C Modularisierung von Programmen. Präprozessor-Anweisungen nutzen.

C - PRÄPROZESSOR. Seminar effiziente C Programmierung WS 2012/13. Von Christian Peter

Der C-Präprozessor. Lukas Stabe

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

Präprozessor und make. einfache Makros Makros nehmen eine Textersetzung vor. Erst nach der Ersetzung muss gültiger C-Code vorliegen.

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Übung zu Grundlagen der Betriebssysteme. Einführungsveranstaltung

Propädeutikum. Dipl.-Inf. Frank Güttler

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

C/C++ Programmierung

Kurzeinführung in C/C++ Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Einleitung

6. Grundlagen der Programmierung

C- Kurs 06 Übersetzung & Module

Übersicht. C Modularisierung. Präprozessor, Compiler, Linker. Präprozessor, Compiler, Linker. Präprozessor, Compiler und und Linker Linker

Einführung in die C-Programmierung

Compiler und Präprozessor (1) Erstellen eines Projektes

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

U1 3. Übung U1 3. Übung. Die Kommandos auf den folgenden Folien dienen der Veranschaulichung. Sind nicht direkt auf die Übungsaufgabe übertragbar

Vorlesung Informatik I

5. Modulare Programmierung

Vorlesung Informatik I

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Systempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom Foliensatz 2

Modulare Programmierung und Bibliotheken

2Binden 3. und Bibliotheken

Installationsanleitung

Grundlagen. Kapitel 1

Systemprogrammierung

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Grundlagen der Informatik Vorlesungsskript

10 Die Programmiersprache C99: Zusammenfassung

L4. Erster Schritt zum Programmieren

Nuetzlicher Kleinkram

Grundlagen der Programmierung

1. Vom Sourcecode zum Programm

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Programmentwicklung mit C++ (unter Unix/Linux)

Softwarepraktikum: Einführung in gcc / g++

Unterlagen. CPP-Uebungen-08/

Algorithmus: Kochrezept

Programmiersprachen Einführung in C

Teil I Debuggen mit gdb

DLLs (dynamic loaded libraries) mit MingW erstellen

Entwicklung mit mehreren Dateien

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Berichte aus der Informatik. Dieter Pawelczak. Start in die C-Programmierung

Linux Prinzipien und Programmierung

Dr. Monika Meiler. Inhalt

Grundlagen der Informatik. Mathias Buhr

Übungen zu Systemprogrammierung 1 (SP1)

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Kapitel 2. Einfache Beispielprogramme

Mapra: C++ Teil 3. Felix Gruber. 29. April IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 3 29.

Kurzeinführung in C99

Vorlesung C-Kurs 9:15-10:45 Mathe 11:15-12:45 1. Woche Hörsaal 1 2. Woche Hörsaal 7

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

C-Programme kompilieren mit Visual Studio Express

Bash-Skripting Linux-Kurs der Unix-AG

Ein- und Ausgabe. C - Kurs Mario Bodemann. 15. September 2010

Objektorientierung: Klassen und Objekte

Die Programmiersprache C99: Zusammenfassung

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

C++ - Einführung in die Programmiersprache Fehler abfangen. Leibniz Universität IT Services Anja Aue

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

GI Vektoren

Hello world. Sebastian Dyroff. 21. September 2009

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

C-Programme erstellen und ausführen

Beispiel. Problem: mehrteilige Nachnamen (von Goethe, Mac Donald, Di Caprio)

Kompaktkurs C-Programmierung

Grundlagen der Informatik 12. Strukturen

Grundlagen der Programmierung

С als erste Programmiersprache

Propädeutikum. Dipl.-Inf. Frank Güttler

C-Programming Hands-on

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Crashkurs: Von Java nach C

Transkript:

Freitagsrunde C-Kurs 2013 Compiler Präprozessor Header Files Tutorium 3 This work is licensed under a Creative Commons Attribution NonCommercial ShareAlike 3.0 License

Gliederung Compiler Präprozessor Header Files

Hello World Revisited Datei hello.c #include <stdio.h> int main(){ } Kommandozeile $ gcc -o hello hello.c $./hello Hello, World! $ printf("hello, World!\n"); return 0; hello kann nach der Kompilierung wie jedes andere Unix Kommando ausgeführt werden 3

Der C Compiler 4

Kompilierung als mehrstufiger Prozess Quellcode-Dateien hello.c Header-Dateien stdio.h Präprozessor Modifizierter Quellcode Bibliotheken /usr/lib/libc.a Linker Compiler Objektdateien hello.o ausführbare Datei hello 5

Hello World bestehend aus mehreren Dateien Datei main.c extern hello(char* who); extern bye(char* who); int main(){ hello("world"); bye("world"); return 0; } Dateien hello.c und bye.c #include <stdio.h> hello(char* who) { printf("hello, %s!\n", who); } #include <stdio.h> bye(char* who) { printf("bye, %s!\n", who); } 6

Separate Kompilierung $ ls bye.c hello.c main.c $ gcc -c main.c $ gcc -c hello.c $ gcc -c bye.c $ ls bye.c hello.c main.c bye.o hello.o main.o $ 7

Linken $ gcc -o hello main.o hello.o bye.o $./hello Hello, World! Bye, World! $ 8

Makefiles Datei Makefile all: main main: main.o hello.o bye.o $(CC) -o hello main.o hello.o bye.o hello.o: hello.c $(CC) -c hello.c bye.o: bye.c $(CC) -c bye.c main.o: main.c $(CC) -c main.c clean: rm -f main main.o hello.o bye.o 9

Übungsaufgabe Kopiert euch die Beispieldateien und das Makefile in einen Ordner. Kompiliert die Dateien zunächst per Hand separat und linkt sie dann zusammen! Führt jedesmal ls aus! Löscht jetzt alle Objekt- und ausführbaren Dateien! Führt make aus und seht euch die Ausgabe an! Löscht die Datei bye.o! Führt erneut make aus und seht euch die Ausgabe an! 10

Typen von Fehlern Präprozessor Fehler, z.b. Compiler Fehler, z.b. Syntaxfehler Typfehler Linker Fehler, z.b. falsch geschriebene Präprozessoranweisung undefinierte symbolische Konstante undefined reference to `hello' collect2: ld returned 1 exit status Laufzeitfehler, z.b. divide by zero Speicherzugriffsfehler: segmentation fault / bus error 11

Der Präprozessor 12

Präprozessoranweisungen am Zeichen # zu Beginn der Anweisung zu erkennen der Präprozessor erkennt nur Zeilen beginnend mit # 13

Präprozessoranweisungen am Zeichen # zu Beginn der Anweisung zu erkennen der Präprozessor erkennt nur Zeilen beginnend mit # Einfügen von Dateien: Ersetzen von Text (Makros): #include #define Bedingte Kompilierung: #if, #ifdef, #ifndef, #else, #elif, #endif 14

Präprozessoranweisungen am Zeichen # zu Beginn der Anweisung zu erkennen der Präprozessor erkennt nur Zeilen beginnend mit # Einfügen von Dateien: Ersetzen von Text (Makros): #include #define Bedingte Kompilierung: #if, #ifdef, #ifndef, #else, #elif, #endif 15

Header Dateien 16

Header Dateien extern hello(char* who); extern bye(char* who); int main(){ hello("world"); bye("world"); return 0; } #include <stdio.h> hello(char* who) { printf("hello, %s!\n", who); } #include <stdio.h> bye(char* who) { printf("bye, %s!\n", who); } 17

Header Dateien Header Dateien erkennt man an der Endung ".h Sie sind Teil von Schnittstellen zwischen Systemen Sie enthalten: Funktions Deklarationen globale Variablen symbolische Konstanten Makros Datentypen (z.b. Strukturen) 18

Inkludieren von Header Dateien #include <name> sucht im Verzeichnis der Systemdateien wird verwendet, um Headerdateien, die vom System geliefert werden, einzubinden (z.b. #include <stdio.h>) #include "name" sucht zuerst im Verzeichnis der Quelldatei erst dann im Verzeichnis der Systemdateien wird normalerweise verwendet, um selbstgeschriebene HeaderDateien einzubinden (z.b. #include "debug.h") 19

I Compileroption (gcc) Erweitert beim Übersetzen eines Programmes die Liste der Verzeichnisse, in denen nach einer Datei gesucht wird. gcc Iinclude hello.c sucht nach stdio.h zuerst als include/stdio.h, und erst dann als /usr/include/stdio.h. 20

E Compileroption (gcc) Was geschieht nun aber eigentlich beim Inkludieren eines Files? Mit -E könnt ihr euch die Ausgabe des Präprozessors ansehen. Probiert's aus: Kommandozeile: $ gcc -E hello.c 21

Präprozessor Output von Hello World # 304 "/usr/include/stdio.h" 3 4 extern int printf ( const char * restrict format,...); 22

Problem: Mehrfachinklusion Datei foo.h #include bar.h Datei bar.h #include baz.h... Datei baz.h 23

Problem: Mehrfachinklusion Datei foo.h Datei bar.h #include bar.h #include baz.h #include baz.h...... Datei baz.h 24

Problem: Mehrfachinklusion Datei foo.h Datei bar.h #include bar.h #include baz.h #include baz.h...... Datei baz.h 25

Problem: Mehrfachinklusion Datei foo.h Datei bar.h #include bar.h #include baz.h #include baz.h...... Datei baz.h #include bar.h... 26

Problem: Mehrfachinklusion Datei foo.h Datei bar.h #include bar.h #include baz.h #include baz.h...... Datei baz.h #include bar.h... 27

Vermeidung von Mehrfachinklusion Datei foo.h #ifndef FOO_H #define FOO_H extern int foo(int x, int y); #endif Die nötigen Sprachmittel, um diesen Code verstehen zu können, werden wir uns im Folgenden aneignen 28

Makros Compiler Präprozessor Einfügen von Dateien: Linker Präprozessor #include Ersetzen von Text (Makros): Compiler #define Bedingte Kompilierung: #if, #ifdef, #ifndef, #else, #elif, #endif 29

Parameterlose Makros Syntax: #define NAME [replacement] Präprozessor ersetzt vor der Kompilierung jedes Vorkommen von NAME mit dem Ersetzungstext Fehlt das replacement, so ist der NAME dem System im Folgenden bekannt, anstatt undefiniert zu sein Um den semantischen Unterschied klarzumachen, sollten Makros immer GROSS geschrieben werden! Ein ausführliches Beispiel werden wir später betrachten 30

Makros mit Parametern Syntax: kein Leerzeichen Leerzeichen #define NAME( dummy1 [ [,dummy2],... ] )... dummy1... Parameterliste Tokenstring Beispiel: #define SIZEOF(array) sizeof(array)/sizeof(array[0]) 31

Ein Wort zur Warnung Da man sich mit Makros sehr, sehr leicht ins Knie schiessen kann, empfehle ich euch für den Fall, dass ihr tiefer ins Thema einsteigen wollt, dringend, euch die Folien vom Vorjahr anzugucken, bevor ihr anfangt, eigene Makros zu schreiben! 32

Bedingte Kompilierung Compiler Präprozessor Einfügen von Dateien: Linker Präprozessor #include Ersetzen von Text (Makros): Compiler #define Bedingte Kompilierung: #if, #ifdef, #ifndef, #else, #elif, #endif 33

Bedingte Kompilierung 34

Bedingte Kompilierung #ifdef _WIN32 /* do Windows specific stuff here */ #endif #ifdef APPLE /* do Mac specific stuff here */ #endif #ifdef linux /* do Linux specific stuff here */ #endif 35

Vermeidung von Mehrfachinklusion Datei foo.h #ifndef FOO_H #define FOO_H extern int foo(int x, int y); #endif Was bewirkt nun dieser Code? 36

Beispiel: Debugging int debug= 1; int main(){ if(debug) printf("entering main...\n ); if(debug) printf("exiting main...\n ); return 0; } 37

Ein einfaches Debugging Makro Datei debug.h #include <stdio.h> #define DEBUG #ifdef DEBUG #define LOG printf #else #define LOG if(0) printf #endif 38

Unser neues Hello World Datei hello.c #include debug.h int main(){ LOG("Hello World!\n"); return 0; } 39

Output des Präprozessors (gcc) $ gcc E hello.c... 748 weitere Zeilen # 11 "hello.c" int main(){ printf("hello, World!\n"); return 0; } $ 40

define per Kommandozeile (gcc) gcc [ Dmacro[=defn]...] infile $ gcc DDEBUG hello.c $ gcc DDEBUG DVERBOSE=2 hello.c 41

Unser neues Debugging Makro Datei debug.h #include <stdio.h> #ifndef VERBOSE #define VERBOSE 0 #endif #ifdef DEBUG #define LOG printf #else #define LOG if(0) printf #endif 42

Unser neues Hello World mit Debug Levels Datei hello.c #include debug.h int main(){ if(verbose >= 1) LOG("Hello World!\n"); return 0; } 43

Debug Levels mit bedingter Kompilierung Datei hello.c #include debug.h int main(){ #if VERBOSE>=1 LOG("Hello World!\n"); #endif return 0; } 44

Fancy Debugging Das Debugging-Makro kann man noch beliebig schöner und aussagekräftiger gestalten (Mit Angabe von Zeilennummer, Funktion, in der man sich gerade befindet, etc). Ihr könnt euch ja mal die Folien von vorigem Jahr angucken! 45

Übungsaufgabe Schreibt ein Makefile für unser neues Hello-WorldBeispiel! Definiert targets release, debug0 und debug1 für Debug-Builds mit verschiedenen verbosity levels! Beachtet, dass auch header-dateien als Abhängigkeiten angegeben werden müssen! Kompiliert euren Code für verschiedene DebugLevels und überzeugt euch anhand des Konsolensowie des Präprozessoroutputs, dass er funktioniert 46

Danke! 47