2. Compiler-Informationen

2.1 Wie erzeuge ich ein Programm? 
  2.1.1 MS-DOS System 
  2.1.2 UNIX System 
2.2 Aufruf und Umgang mit dem Compiler in den Übungen
2.3 INCLUDE-Dateien und Bibliotheksfunktionen von C

Dieses Kapitel ist das einzige Kapitel, das sich notwendigerweise auf einen bestimmten Rechner und sogar auf einen bestimmten C-Übersetzer beziehen muß, da die Bedienung der einzelnen C-Übersetzer sehr unterschiedlich sein kann. Wir werden hier auch nur C-Compiler betrachten und uns nicht mit C-Interpretern beschäftigen, bei denen die Programmerzeugung etwas anders aussieht.

2.1 Wie erzeuge ich ein Programm?

Der grundsätzliche Weg von der Idee zum lauffähigen Programm kann so gekennzeichnet werden:

Editor ---> C-Compiler ---> Linker ---> Programm

Mit dem Editor wird eine Quellencodedatei erzeugt, die vom C-Compiler in eine Objektdatei übersetzt wird. Aus dieser erzeugt der Linker unter Verwendung der C-Bibliothek dann das lauffähige Programm. Oftmals sind die Funktionen von Compiler und Linker in einem Programm zusammengefaßt.

2.1.1 MS-DOS System

Auf einem MS-DOS System gibt es z.B. die Editoren bzw. Textverarbeitungsprogramme EDLIN, EDIT und WORD. Der Compiler hat je nach Hersteller einen anderen Namen. Zum Linken wird meist der MS-DOS Linker verwendet. Die Dateinamen haben üblicherweise folgende Dateinamenergänzungen:

.c für den Quellencode

.h für Include-Dateien

.obj für den Objektcode

.exe für das lauffähige Programm

Mit dem Aufkommen von Programmierumgebungen für PCs (Zorlite C, Microsoft C und Turbo C) hat der Benutzer eine komfortable Umgebung zur Erzeugung und zum Austesten von Programmen. Sie sind (fast) selbsterklärend und arbeiten mit Pull-Down-Menüs. Weiterhin verfügen diese Umgebungen über einen integrierten Editor und eine On-Line-Hilfe-Funktion. Sie zeigen Syntaxfehler im Quellencode an. Dies ist insbesondere für Anfänger in der Programmiersprache C sehr wertvoll, da Fehler somit leicht gefunden werden. Meist verfügen Sie auch über einen Debugger, mit dem man das ablaufende Programme an beliebig wählbaren Stellen anhalten, Variablen abfragen und dann weiterlaufen lassen kann. Damit lassen sich auch Laufzeitfehler (insbesondere bei der Zeigerverarbeitung) aufspüren.

2.1.2 UNIX System

Auf einem UNIX System kann man als Editor z.B. vi, emacs oder pine verwenden. Der C-Compiler schließt hier die Linkfunktion mit ein und heißt CC. Der Compiler entspricht meist der ANSI-Norm. Die Dateinamen haben üblicherweise folgende Dateinamenergänzungen:

.c für den Quellencode

.h für Include-Dateien

.o für den Objektcode

a .out für das lauffähige Programm

Die Bibliotheksdateien befinden sich meist im Verzeichnis /usr/lib und die Include-Dateien stehen in /usr/lib/include.

Auf einem UNIX System gibt es weiterhin einen C-Syntaxchecker. Dieses Programm heißt LINT und erzeugt keinen Code, unterwirft das Quellenprogramm aber einer ausführlichen Syntaxanalyse, die der normale C-Compiler CC nicht bietet. Ein Programm, das von LINT ohne Fehlermeldung bearbeitet wurde, kann als höchst portabel betrachtet werden. Schließlich gibt es, je nach System, auch eine symbolischen Debugger SDB. Nähere Informationen zu cc, lint und sdb kann man auf einem UNIX System mit Hilfe des man-Kommandos erhalten.

2.2 Aufruf und Umgang mit dem Compiler in den Übungen

Der grundlegende Aufruf für den Compiler lautet:

cc Dateiname.c

Damit wird das Quellenprogramm in der Datei "Dateiname.c" übersetzt und anschließend automatisch der Linker aufgerufen. Es entsteht im allgemeinen keine Objektdatei (mit der Dateinamenerweiterung .o) sondern nur das fertige Programm in der Datei a.out. Wandelt man den obigen Aufruf wie folgt ab:

cc -o Dateiname1 Dateiname2.c

so wird das fertige Programm in die Datei "Dateiname1" geschrieben. Die Dateinamen "Dateiname1" und "Dateiname2" können auch gleich sien. Die Rechte zur Programmausführung für den Benutzer werden in beiden Fällen automatisch gesetzt.

Es empfiehlt sich, fertige Programme und Quellencodedateien in einem Unterverzeichnis des eigenen Home-Verzeichnisses aufzubewahren, damit man einen besseren Überblick behält.

2.3 INCLUDE-Dateien und Bibliotheksfunktionen von C

Wichtig zur Programmerzeugung sind weiterhin die C-Bibliothek und die Header-(Include-)Dateien. Deren Namen sind, da sie fast in jedem C-Programm benötigt werden, standardisiert. Ebenso natürlich die Namen der Bibliotheksfunktionen. Die folgenden Listen der Include-Dateien und der Bibliotheksfunktionen beziehen sich auf TURBO C 2.0. Sie werden hier angegeben, um Ihnen einen Gesamtüberblick zu geben. Viele Funktionen und Include-Dateien sind aber nicht bei allen C Compilern vorhanden (insbesondere natürlich nicht die MS-DOS spezifischen).

Hier sind zunächst die Include-Dateien aufgelistet. Das Hauptanwendungsgebiet der jeweiligen Include-Datei ist ebenfalls angegeben.

ALLOC.H Speicherverwaltung

ASSERT.H Assert-Debugging-Makro

BIOS.H BIOS-Funktionen

CONIO.H Ein-/Ausgabe für die DOS-Konsole

CTYPE.H Zeichenklassifizierung und -umwandlung

DIR.H Directory-Verwaltung

DOS.H DOS-Funktionen

ERRNO.H Mnemonics für Fehlercodes

FCNTL.H Konstantendefinitionen für OPEN (von Dateien)

FLOAT.H Parameter für Gleitpunktroutinen

IO.H Low-Level Ein-/Ausgaberoutinen

LIMITS.H Informationen zu Grenzwerten versch. Parameter

MATH.H Mathematik-Funktionen

MEM.H Speicher-Manipulations-Funktionen

PROCESS.H Prozeßverwaltung

SETJMP.H Routinen für FAR-Sprünge

SHARE.H Parameter für File-Sharing

SIGNAL.H Abfrage von Betriebssystem-Flaggs

STDARG.H Makros für variable Anzahl von Funktionsparametern

STDDEF.H Definition gebräuchlicher Datentypen und Makros

STDIO.H Standard Ein-/Ausgabe

STDLIB.H oft beötigte gebräuchliche Funktionen zur Umwandlung, Suche und zum Sortieren von Daten

STRING.H Zeichenketten-Funktionen

SYS\STAT.H Symbolische Konstanten für Dateioperationen

TIME.H Zeit-Funktionen

VALUES.H wichtige Konstanten einschließlich Maschinenabhängigkeiten

Es folgt nun eine Liste der Bibliotheksfunktionen. Sie sind zu Kategorien zusammengefaßt, um ein schnelleres Suchen nach einer Funktion für eine bestimmte Aufgabe zu ermöglichen. Manche Funktionen kommen mehrfach vor, da sie verschiedenen Kategorien zugeordnet werden können. Die Kategorien sind alphabetisch geordnet; ebenso die Funktionsnamen innerhalb der einzelnen Kategorien.

Die Funktionsnamen geben oft schon einen Hinweis auf ihre Funktion. Weitergehende Informationen erhält man durch das Schreiben des Namens der Funktion, Positionieren des Cursors auf diesen Namen und die Anfrage nach Syntaxhilfe (Funktionstaste LOOKUP). Eine ausführliche Beschreibung der Funktionen findet man im Referenzhandbuch für den jeweiligen Compiler.

Diagnose-Routinen (Prototypen in assert.h, math.h und errno.h)

assert matherr perror

Directory-Routinen (Prototypen in dir.h)

chdir findfirst findnext fnmerge fnsplit getcurdir

getcwd getdisk mkdir mktemp rmdir searchpath

setdisk

Ein-/Ausgabe-Routinen (Prototypen überwiegend in stdio.h und io.h, aber auch in conio.h und signal.h)

access cgets chmod _chmod clearerr _close

close cprintf cputs creat _creat creatnew

creattemp dup dup2 eof fclose fcloseall

fdopen feof ferror fflush fgetc fgetchar

fgets filelength fileno flushall fopen fprintf

fputc fputchar fputs fread freopen fscanf

fseek ftell fwrite getc getch getchar

getche getftime getpass gets getw gsignal

ioctl isatty kbhit lock lseek _open

open perror printf putc putch putchar

puts putw read _read remove rename

rewind scanf setbuf setftime setmode setvbuf

sopen sprintf sscanf ssignal strerror tell

ungetc ungetch unlock vfprintf vfscanf vsprintf

vsscanf _write write

Interface-Routinen für DOS, BIOS und 8086 (Prototypen überwiegend in dos.h, aber auch in bios.h)

absread abswrite bdos bdosptr bioscom biosdisk

biosequip bioskey biosmemory biosprint biostime country

ctrlbrk disable dosexterr enable FP_OFF FP_SEG

freemem geninterrupt getcbrk getdfree getdta getfat

getfatd getpsp getvect getverify harderr hardresume

hardretn inport inportb int86 int86x intdos

intdosx intr keep MK_FP outport outportb

parsfnm peek peekb poke pokeb randbrd

randbwr segread setdta setvect setverify sleep

unlink

Klassifizierungs-Routinen (Prototypen in ctype.h)

isalnum isalpha isascii iscntrl isdigit isgraph

islower isprint ispunct isspace isupper isxdigit

Konvertierungs-Routinen (Prototypen überwiegend in stdlib.h, einige auch in ctype.h)

atof atoi atol ecvt fcvt gcvt

itoa ltoa strtod strtol toascii _tolower

tolower _toupper toupper uitoa

Mathematik-Routinen (Prototypen überwiegend in math.h, aber auch in float.h und stdlib.h)

abs acos asin atan atan2 atof

atoi atol cabs ceil_ clear87 _control87

cos cosh ecvt exp fabs fcvt

floor fmod _fpreset87 frexp gcvt hypot

itoa labs ldexp log log10 ltoa

_matherr matherr modf poly pow pow10

rand sin sinh sqrt srand _status87

strtod strtol tan tanh uitoa

Prozeß-Routinen (Prototypen in process.h)

abort execl execle execlp execlpe execv

execve execvp execvpe _exit exit spawnl

spawnle spawnlp spawnlpe spawnv spawnve spawnvp

spawnvpe system

Sonstige-Routinen (Prototypen in setjmp.h)

setjmp longjmp

Speicher-Verwaltungs-Routinen (Prototypen überwiegend in alloc.h, aber auch in stdlib.h und dos.h)

allocmem brk calloc coreleft farcalloc farcoreleft

farmalloc farrealloc free malloc realloc sbrk

setblock

Standard-Routinen (Prototypen in stdlib.h)

abort abs atexit atof atoi atol

bsearch calloc ecvt _exit exit fcvt

free gcvt getenv itoa labs lfind

lsearch ltoa malloc putenv qsort rand

realloc srand strtod strtol swab system

uitoa

String- und Speicher-Manipulations-Routinen (Prototypen überwiegend in string.h, aber auch in mem.h)

memcpy memchr memcmp memicmp memmove memset

movebytes movedata movmem setmem stpcpy strcat

strchr strcmp strcpy strcspn strdup strerror

stricmp strlen strlwr strncat strncmp strncpy

strnicmp strnset strpbrk strrchr strrev strset

strspn strstr strtok strtol strtoul strupr

Zeit- und Datums-Routinen (Prototypen in time.h und dos.h)

memcpy memchr memcmp memicmp memmove memset

asctime ctime difftime dostounix getdate gettime

gmtime localtime setdate settime stime tzset

unixtodos

zurück zum Inhaltsverzeichnis