2 Hello World Revisited Datei hello.c Kommandozeile #include int main(){ printf("Hello, World!\n"); return 0; } $ gcc -o hello hello.c $./hello Hello,

Slides:



Advertisements
Ähnliche Präsentationen
Strukturen in C Spelz, Sievers, Bethke.
Advertisements

Ein- und Ausgabe von Dateien
Forschungszentrum caesar
Funktionen und Module Einführung anhand des Beispiels Wörter sortieren Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik.
Hochschule Fulda – FB ET Sommersemester 2010
Hochschule Fulda – FB ET Sommersemester 2010
C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.
Java: Dynamische Datentypen
SWITCH - Anweisung.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
Spieleprogrammierung mit DirectX und C++
1 Named Pipes alias FIFO Haben einen Eintrag im Dateisystem und sind somit durch Zugriffsrechte identifizierbar Ermöglichen die Kommunikation zwischen.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Das erste Programm (Folie 16)
Der C-Präprozessor EDV1 - 04Präprozessor.
Einführung in Visual C++
1EDV 1 - Java Native Interface Java mit eingebundenen (native) C-Programme Vortrag: Rolf Heitzenröder am
14StrukturKlasse1 Von der Struktur zur Klasse von C zu C++ Von Jens Hoffmann
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
Der C-Präprozessor 08-CPräprozessor.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die.
Einführung in die Programmiersprache C 1
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Programmiersprache C 4
Portabilität Seminar aus Softwareentwicklung: Programmierstil Christine Schiestl WS 02 / 03.
Programmieren in C Grundlagen C 5
Informatik II Grundlagen der Programmierung Programmieren in C Benutzerinteraktion / Ein- und Ausgabe Hochschule Fulda – FB ET Sommersemester
Informatik Grundlagen, WS04, Seminar 7
BMEVIEEA100 Grundlagen der Programmierung
Programmieren in C Module und Bibliotheken Hochschule Fulda – FB AI Sommersemester Peter Klingebiel, HS Fulda, DVZ.
Programmieren in C Dateien
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Einführung in die Programmiersprache C 5.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Programmieren in C Grundlagen C 1 Hochschule Fulda – FB AI Sommersemester Peter Klingebiel, HS Fulda, DVZ.
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Pointer. Precompiled Header  Vorübersetzung eingebundener Dateien häufig genutzt, selten geändert  Projekttyp „Win32 Console Application“
Einführung. Ziel der Veranstaltung  Vermittlung von Grundkenntnissen in C++  Solide Basis für anschließende Weiterentwicklung  Fähigkeit, kleine Programme.
Java Programme nur ein bisschen objektorientiert.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Inhalte der Übungen 1.Grundlagen, Ein- und Ausgabe 2.Kontrollstrukturen (Projekt 1) 3.Funktionen 4.Zeiger, Felder (Projekt 2) 5.Strings, Strukturen 6.Fileverarbeitung.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1.
ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1.
Programmieren in C Dateien
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Programmieren in C Grundlagen C 1
IOStreamLibrary.
Hello World! Javakurs 2013 Arne Kappen
Java-Kurs - 4. Übung weitere Kontrollstrukturen
Hochschule Fulda – FB AI Wintersemester 2014/15
Referenzen In c kennen wir gewöhnliche Variablen und Pointer.
Programmieren in C Module und Bibliotheken
IOStreamLibrary.
Arten von Kontrollstrukturen
Einführung in die Programmierung
Seminar Programmierstil: Codierungsstandards
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
GRUNDLAGEN WISSENSCHAFTLICHEN ARBEITENS MODULA-2 SONAY SUBAYAZ
«Delegierter» Methoden Schablone Funktionszeiger
Programmieren in C SS 2019 Vorlesung 2, Dienstag 30. April 2018
Einführung in die Programmierung
 Präsentation transkript:

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

3 Der C-Compiler

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

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

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

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

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

9 Der Präprozessor

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

11 – Syntax: #define name [replacement] – Anwendung: Definition von symbolischen Konstanten #define PI – Präprozessor ersetzt vor der Kompilierung jedes Vorkommen von PI mit – Erhöht die Lesbarkeit und Wartbarkeit des Programms – Parameterlose Makros

12 – Syntax: #define name(dummy1[,dummy2][,...]) tokenstring – Expression Makros – übersetzt in einen Ausdruck – ähnlich einer Funktion, die einen Wert zurückgibt #define RADTODEG(x) ((x) * ) – Statement Makros – übersetzt in ein oder mehrere volle C statements – ähnlich einer Funktion, die void zurückgibt #define SWAP(x, y) \ do{ tmp = x; x = y; y = tmp; } while(0) – Makros mit Parametern

13 – Warum Klammern? #define RADTODEG(x) (x * ) RADTODEG(a + b) (a + b * ) #define RADTODEG(x) (x) * / RADTODEG(a) 1 / (a) *

14 Semikolon beim Aufruf sieht natürlicher aus -> Programmierer könnten Semikolons doppelt setzen und damit den Control Flow eines Programms ändern #define RADTODEG(x) ((x) * ); #define DEGTORAD(x) ((x) * ); – Warum kein Semikolon am Ende eines Makros? if(to_degree) y= RADTODEG(x); else y= DEGTORAD(x); if(to_degree) y= ((x) * );; else y= ((x) * );;

15 – Warum kein Semikolon am Ende eines Makros? if(((x) * );>180) y= ((x) * );+180; if(RADTODEG(x)>180) y= RADTODEG(x)+180; zusätzliches Problem bei Expression Makros #define RADTODEG(x) ((x) * );

16 /* * Swaps two values. * Requires tmp variable to be defined. */ #define SWAP(x, y) \ do{ \ tmp = x; \ x = y; \ y = tmp; \ } \ while(0) – Mehrzeilige Statement Makros

17 /* * Swaps two values. * Requires type passed as parameter */ #define SWAP(x, y, type) \ do{ \ type tmp = x; \ x = y; \ y = tmp; \ } \ while(0) – Alternatives SWAP

18 /* * Swaps two values. * Requires gcc typeof extension */ #define SWAP(x, y) \ do{ \ typeof(x) tmp = x; \ x = y; \ y = tmp; \ } \ while(0) – Elegante Lösung (nur gcc)

19 – Warum do{...} while(0) ? #define SWAP(x, y) \ tmp = x; \ x = y; \ y = tmp int x, y, tmp; if (x > y) SWAP(x, y); int x, y, tmp; if(x > y) tmp = x; x = y; y = tmp;

20 – Warum do{...} while(0) ? #define SWAP(x, y){ \ tmp = x; \ x = y; \ y = tmp; \ } int x, y, tmp; if (x > y) SWAP(x, y); else... int x, y, tmp; if (x > y) { tmp = x; x = y; y = tmp; }; else...

21 – Wenn ein Dummy-Argument für einen Wert (oder einen Pointer zu einem Wert) steht, alle Vorkommen im Tokenstring klammern – Den gesamten Tokenstring von Expression Makros klammern – Keine Semikolons am Ende eines Makros – Mehrzeilige Statement Makros mit \ trennen – Tokenstring von mehrzeiligen Statement Makros mit do{..} while(0) umschließen – Zusammenfassung

22 – das Symbol erscheint beim Testen des Programms mittels Debugger nicht mehr – Makros können sich ungewollt überschreiben – Makros werden erst expandiert und daher vom Compiler überprüft, wenn sie tatsächlich aufgerufen werden – Mehrfache Seiteneffekte #define MIN(a, b) ((a)>(b)?(b):(a)) x = y = 1; MIN(++x, ++y); – Weitere Probleme

23 Makro Styleguide – Namenskonvention Großbuchstaben – Wenn möglich, Funktionen statt Makros verwenden – Alternativen: – Parameterlose Makros – const (C90) – Makros mit Parametern – inline (C99) – Vorsicht bei Makros zur Optimierung – Makros kurz halten – keine Hacks!

24 Bedingte Kompilierung

25 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

26 #define PI #define RADTODEG(x) ((x) * ) int debug= 1; int main(){... if(debug) printf("PI %f", RADTODEG(PI));... return 0; } Beispiel: Debugging

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

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

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

30 gcc [-Dmacro[=defn]...] infile %gcc -DDEBUG hello.c % gcc -DDEBUG -DVERBOSE=1 hello.c define per Kommandozeile (gcc)

31 #include #define VERBOSE 0 #ifdef DEBUG #define LOG printf #else #define LOG if (0) printf #endif Hinzufügen von Debug Levels Datei debug.h

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

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

34 Header-Dateien

35 Header-Dateien

36 – 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) Header-Dateien

37 #include – sucht zuerst im Verzeichnis der Systemdateien – erst dann im Verzeichnis der Quelldatei – wird normalerweise verwendet, um Headerdateien, die vom System geliefert werden, einzubinden (z.B. #include ) #include "name" – sucht zuerst im Verzeichnis der Quelldatei – erst dann im Verzeichnis der Systemdateien – wird normalerweise verwendet, um selbst geschriebene Header-Dateien einzubinden (z.B. #include " debug.h " ) Inkludieren von Header- Dateien

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

39 # 1 "debug.c" # 1 " " # 1 "debug.c" # 1 "/usr/include/stdio.h" # 28 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/features.h" # 330 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" # 348 "/usr/include/sys/cdefs.h" 3 4 # 1 "/usr/include/bits/wordsize.h" # 349 "/usr/include/sys/cdefs.h" # 331 "/usr/include/features.h" # 354 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" # 1 "/usr/include/bits/wordsize.h" # 5 "/usr/include/gnu/stubs.h" # 1 "/usr/include/gnu/stubs-32.h" # 8 "/usr/include/gnu/stubs.h" # 355 "/usr/include/features.h" # 29 "/usr/include/stdio.h" # 1 "/usr/lib/gcc/i486-linux-gnu/4.3.2/include/stddef.h" # 214 "/usr/lib/gcc/i486-linux-gnu/4.3.2/include/stddef.h" 3 4 typedef unsigned int size_t; # 35 "/usr/include/stdio.h" # 1 "/usr/include/bits/types.h" # 28 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/wordsize.h" # 29 "/usr/include/bits/types.h" typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; __extension__ typedef signed long long int __int64_t; __extension__ typedef unsigned long long int __uint64_t; __extension__ typedef long long int __quad_t; __extension__ typedef unsigned long long int __u_quad_t; # 131 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" # 132 "/usr/include/bits/types.h" __extension__ typedef __u_quad_t __dev_t; __extension__ typedef unsigned int __uid_t; __extension__ typedef unsigned int __gid_t; __extension__ typedef unsigned long int __ino_t; __extension__ typedef __u_quad_t __ino64_t; __extension__ typedef unsigned int __mode_t; __extension__ typedef unsigned int __nlink_t; __extension__ typedef long int __off_t; __extension__ typedef __quad_t __off64_t; __extension__ typedef int __pid_t; __extension__ typedef struct { int __val[2]; } __fsid_t; __extension__ typedef long int __clock_t; __extension__ typedef unsigned long int __rlim_t; __extension__ typedef __u_quad_t __rlim64_t; __extension__ typedef unsigned int __id_t; __extension__ typedef long int __time_t; __extension__ typedef unsigned int __useconds_t; __extension__ typedef long int __suseconds_t; __extension__ typedef int __daddr_t; __extension__ typedef long int __swblk_t; __extension__ typedef int __key_t; __extension__ typedef int __clockid_t; __extension__ typedef void * __timer_t; __extension__ typedef long int __blksize_t; __extension__ typedef long int __blkcnt_t; __extension__ typedef __quad_t __blkcnt64_t; __extension__ typedef unsigned long int __fsblkcnt_t; __extension__ typedef __u_quad_t __fsblkcnt64_t; __extension__ typedef unsigned long int __fsfilcnt_t; __extension__ typedef __u_quad_t __fsfilcnt64_t; __extension__ typedef int __ssize_t; typedef __off64_t __loff_t; typedef __quad_t *__qaddr_t; typedef char *__caddr_t; __extension__ typedef int __intptr_t; __extension__ typedef unsigned int __socklen_t; # 37 "/usr/include/stdio.h" # 45 "/usr/include/stdio.h" 3 4 struct _IO_FILE; typedef struct _IO_FILE FILE; # 65 "/usr/include/stdio.h" 3 4 typedef struct _IO_FILE __FILE; # 75 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/libio.h" # 32 "/usr/include/libio.h" 3 4 # 1 "/usr/include/_G_config.h" # 15 "/usr/include/_G_config.h" 3 4 # 1 "/usr/lib/gcc/i486-linux-gnu/4.3.2/include/stddef.h" # 16 "/usr/include/_G_config.h" # 1 "/usr/include/wchar.h" # 78 "/usr/include/wchar.h" 3 4 typedef struct { int __count; union { unsigned int __wch; char __wchb[4]; } __value; } __mbstate_t; # 21 "/usr/include/_G_config.h" typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 319 "/usr/include/libio.h" 3 4 __off64_t _offset; # 328 "/usr/include/libio.h" 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; }; typedef struct _IO_FILE _IO_FILE; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 364 "/usr/include/libio.h" 3 4 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); # 416 "/usr/include/libio.h" 3 4 extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); # 458 "/usr/include/libio.h" 3 4 extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) __attribute__ ((__nothrow__)); extern int _IO_ferror (_IO_FILE *__fp) __attribute__ ((__nothrow__)); extern int _IO_peekc_locked (_IO_FILE *__fp); extern void _IO_flockfile (_IO_FILE *) __attribute__ ((__nothrow__)); extern void _IO_funlockfile (_IO_FILE *) __attribute__ ((__nothrow__)); extern int _IO_ftrylockfile (_IO_FILE *) __attribute__ ((__nothrow__)); # 488 "/usr/include/libio.h" 3 4 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list); extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) __attribute__ ((__nothrow__)); # 76 "/usr/include/stdio.h" # 89 "/usr/include/stdio.h" 3 4 typedef _G_fpos_t fpos_t; # 141 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/bits/stdio_lim.h" # 142 "/usr/include/stdio.h" extern struct _IO_FILE *stdin; extern struct _IO_FILE *stdout; extern struct _IO_FILE *stderr; extern int remove (__const char *__filename) __attribute__ ((__nothrow__)); extern int rename (__const char *__old, __const char *__new) __attribute__ ((__nothrow__)); extern FILE *tmpfile (void) ; # 186 "/usr/include/stdio.h" 3 4 extern char *tmpnam (char *__s) __attribute__ ((__nothrow__)) ; extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__)) ; # 204 "/usr/include/stdio.h" 3 4 extern char *tempnam (__const char *__dir, __const char *__pfx) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ; extern int fclose (FILE *__stream); extern int fflush (FILE *__stream); # 229 "/usr/include/stdio.h" 3 4 extern int fflush_unlocked (FILE *__stream); # 243 "/usr/include/stdio.h" 3 4 extern FILE *fopen (__const char *__restrict __filename, __const char *__restrict __modes) ; extern FILE *freopen (__const char *__restrict __filename, __const char *__restrict __modes, FILE *__restrict __stream) ; # 272 "/usr/include/stdio.h" 3 4 # 283 "/usr/include/stdio.h" 3 4 extern FILE *fdopen (int __fd, __const char *__modes) __attribute__ ((__nothrow__)) ; # 304 "/usr/include/stdio.h" 3 4 extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__)); extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) __attribute__ ((__nothrow__)); extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) __attribute__ ((__nothrow__)); extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__)); extern int fprintf (FILE *__restrict __stream, __const char *__restrict __format,...); extern int printf (__const char *__restrict __format,...); extern int sprintf (char *__restrict __s, __const char *__restrict __format,...) __attribute__ ((__nothrow__)); extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format, __gnuc_va_list __arg); extern int vprintf (__const char *__restrict __format, __gnuc_va_list __arg); extern int vsprintf (char *__restrict __s, __const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__nothrow__)); extern int snprintf (char *__restrict __s, size_t __maxlen, __const char *__restrict __format,...) __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, __const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 0))); # 398 "/usr/include/stdio.h" 3 4 extern int fscanf (FILE *__restrict __stream, __const char *__restrict __format,...) ; extern int scanf (__const char *__restrict __format,...) ; extern int sscanf (__const char *__restrict __s, __const char *__restrict __format,...) __attribute__ ((__nothrow__)); # 441 "/usr/include/stdio.h" 3 4 # 504 "/usr/include/stdio.h" 3 4 extern int fgetc (FILE *__stream); extern int getc (FILE *__stream); extern int getchar (void); # 528 "/usr/include/stdio.h" 3 4 extern int getc_unlocked (FILE *__stream); extern int getchar_unlocked (void); # 539 "/usr/include/stdio.h" 3 4 extern int fgetc_unlocked (FILE *__stream); extern int fputc (int __c, FILE *__stream); extern int putc (int __c, FILE *__stream); extern int putchar (int __c); # 572 "/usr/include/stdio.h" 3 4 extern int fputc_unlocked (int __c, FILE *__stream); extern int putc_unlocked (int __c, FILE *__stream); extern int putchar_unlocked (int __c); extern int getw (FILE *__stream); extern int putw (int __w, FILE *__stream); extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; extern char *gets (char *__s) ; # 653 "/usr/include/stdio.h" 3 4 extern int fputs (__const char *__restrict __s, FILE *__restrict __stream); extern int puts (__const char *__s); extern int ungetc (int __c, FILE *__stream); extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (__const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s) ; # 706 "/usr/include/stdio.h" 3 4 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern int fseek (FILE *__stream, long int __off, int __whence); extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream); # 742 "/usr/include/stdio.h" 3 4 extern int fseeko (FILE *__stream, __off_t __off, int __whence); extern __off_t ftello (FILE *__stream) ; # 761 "/usr/include/stdio.h" 3 4 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); extern int fsetpos (FILE *__stream, __const fpos_t *__pos); # 784 "/usr/include/stdio.h" 3 4 # 793 "/usr/include/stdio.h" 3 4 extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__)); extern int feof (FILE *__stream) __attribute__ ((__nothrow__)) ; extern int ferror (FILE *__stream) __attribute__ ((__nothrow__)) ; extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__)); extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__)) ; extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__)) ; extern void perror (__const char *__s); # 1 "/usr/include/bits/sys_errlist.h" # 27 "/usr/include/bits/sys_errlist.h" 3 4 extern int sys_nerr; extern __const char *__const sys_errlist[]; # 823 "/usr/include/stdio.h" extern int fileno (FILE *__stream) __attribute__ ((__nothrow__)) ; extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__)) ; # 842 "/usr/include/stdio.h" 3 4 extern FILE *popen (__const char *__command, __const char *__modes) ; extern int pclose (FILE *__stream); extern char *ctermid (char *__s) __attribute__ ((__nothrow__)); # 882 "/usr/include/stdio.h" 3 4 extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__)); extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__)) ; extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__)); # 912 "/usr/include/stdio.h" 3 4 # 2 "debug.c" 2 # 11 "debug.c" int main(){ printf("Hello World!\n"); } – Präprozessor-Output von Hello World # 304 "/usr/include/stdio.h" 3 4 extern int printf (__const char *__restrict __format,...);

40 #include “bar.h“ #include “baz.h“... Problem: Mehrfachinklusion Datei foo.h #include “baz.h“... Datei bar.h Datei baz.h

41 #include “bar.h“ #include “baz.h“... Problem: Mehrfachinklusion Datei foo.h #include “baz.h“... Datei bar.h Datei baz.h

42 #include “bar.h“ #include “baz.h“... Problem: Mehrfachinklusion Datei foo.h #include “baz.h“... #include “bar.h“... Datei bar.h Datei baz.h

43 #include “bar.h“ #include “baz.h“... Problem: Mehrfachinklusion Datei foo.h #include “baz.h“... #include “bar.h“... Datei bar.h Datei baz.h

44 #ifndef FOO_H #define FOO_H extern int foo(int x, int y); #endif Vermeidung von Mehrfachinklusion Datei foo.h

45 Der Präprozessor

46 Danke!