Anfang zurück vorwärts Ende
ANSI C - Ein Programmierkurs - Teil XIV
Compilerschalter/-optionen
Hier folgt eine kurze Übersicht und Erklärung von Compileroptionen. Da
Sozobon und erst recht der GCC eine größere Anzahl von Schaltern
kennen, kann hier nur eine Auswahl vorgestellt werden. Für eine
weitergehende Beschreibung wird auf die jeweilige Dokumentation
verwiesen.
TC-Compileroptionen
Die Optionen für TC/PC findet man unter Options im Menüpunkt Compiler.
- -A (ANSI keywords only)
- Diese Option verbietet die TC-eigenen Erweiterungen des ANSI-Standards.
Für portable Programme sollte deshalb diese Option gesetzt werden.
- -C (Allow nested comments)
- Diese Option erlaubt verschachtelte Kommentare. Für portable Programme
sollte deshalb diese Option nicht gesetzt werden.
- -Y (Add debug Information)
- Diese Option erzeugt Informationen für den Turbo-Debugger.
- -T (Stack checking)
- Diese Option erzeugt Code, der den Stack zur Laufzeit überprüft. Dadurch
wird das Programm zwar langsamer, aber es können noch Fehler oder auch
nur eine ungünstige Einstellung für die Stackgröße gefunden werden.
- -B (Generate standard Object)
- Mit dieser Option erzeugt der Compiler das DRI-Object-Format. Allerdings
werden in diesem Objektformat nur 8 Zeichen von Bezeichner unterschieden
und es sind keine Debug-Information möglich. Diese Option ist nur dann
wichtig, wenn das Objektfile zu einem Programm in einer anderen Sprache
hinzugelinkt wird.
- -X (Generate underbars)
- Diese Option setzt vor jedes Symbol einen '_'. Diese Option ist nur dann
wichtig, wenn das Objektfile zu einem Programm in einer anderen Sprache
hinzugelinkt wird.
- -H (Use cdecl calling)
- Diese Option weist den Compiler an, die Parameter für Funktionen auf dem
Stack zu übergeben und das Ergebnis in Register D0 zurückzugeben.
- -Q (Use pascal calling)
- Diese Option weist den Compiler an, die Parameter von links nach rechts
auf dem Stack zu übergeben und das Ergebnis in D0 zurückzugeben.
- -K (Default char is unsigned)
- Diese Option setzt den Standard-Datentyp für char auf unsigned. Achtung:
wenn mittels dieser Option zwischen signed und unsigned char umgeschaltet
wird, sind die Programme nicht mehr portabel!
- -J (No jump optimization)
- Diese Option weist den Compiler an, keine Programmsprünge zu optimieren.
- -Z (No register optimization)
- Diese Option weist den Compiler an, bereits geladene Register-Werte
nicht zu berücksichtigen
- -M (No string merging)
- Diese Option weist den Compiler an, doppelte Strings nicht zusammenlegen.
Dies ist dann wichtig, wenn Stringkonstanten verändert werden, weil sie
z.B. auch als Platzhalter dienen
- -R (No register variables)
- Diese Option weist den Compiler an, keine Register-Variablen zu verwenden.
- -G (Size optimization)
- Diese Option weist den Compiler an, die Programmgröße zu optimieren.
- -P (Use absolute calls)
- Diese Option weist den Compiler an, absolute Unterprogrammaufrufe zu
verwenden. Da ein relativer Sprung beim 68000 nur über +-32KB gehen
kann, ist dies für größere Programme erforderlich. Andernfalls liefert
der Linker eine entsprechende Fehlermeldung.
- -S (Standard stack frames)
- Diese Option weist den Compiler an, in Funktionen die Link- und die
Unlink-Anweisungen des Prozessors zu verwenden, um Platz auf dem
Stack für lokale Variablen anzulegen.
- -2 (Generate 68020 Code)
- Diese Option weist den Compiler an, Code für einen 68020-Prozessor oder
größer zu erzeugen. Es sollte aber normalerweise keinen Grund geben,
die älteren Ataris (1040, Mega ST, ...) auszusperren, da diese
Optimierung nur einen geringen Vorteil bietet.
- -8 (Generate 68881 Code)
- Diese Option weist den Compiler an, Code für den 68881-Coprozessor zu
erzeugen. Damit läuft das Programm nur noch auf Ataris mit FPU. Wenn
ein Programm intensiv Fließkommaberechnung benutzen muss, ist diese
Optimierung sinnvoll.
Maximum identifier length ist die maximale Länge für Bezeichner, die noch
unterschieden werden können.
Warning level gibt die Warnstufe von 0 bis 2 an. Je höher die Warnstufe
ist, desto mehr Dinge werden vom Compiler bemängelt. Da einige Warnings
auch zu Fehlern führen könnten, sollte die Warnstufe immer so hoch wie
möglich eingestellt werden und so programmiert werden, dass keine Warnungen
erscheinen. Es gibt z.B. ein Warning, wenn ein Returnwert einer Funktion
nicht gesetzt wird. Wird dieser Returnwert aber abgefragt, kann dies zu
einem unerwünschten Verhalten des Programms führen.
Sozobon-Compilerschalter
Bei den Schaltern für Sozobon handelt es sich um Kommandozeilenparameter.
- -c
- Dieser Schalter weist den Compiler an, die Datei nur zu compilieren und
den Linker nicht aufzurufen. Das daraus resultierende Objektfile hat
den gleichen Namen wie die Quelldatei, aber mit .o als Extension.
Dieser Schalter wird benötigt, wenn eine Programm aus mehr als einer
Datei besteht. Dann muss jede Datei nur übersetzt und sämtliche
Objektdateien zum Programm zusammengelinkt werden.
- -S
- Sozobon übersetzt eine Quelldatei zu einer Objektdatei in zwei Schritten.
Im ersten Schritt wird eine Assemblerdatei erzeugt, die anschließend von
einem Assembler übersetzt wird. Dieser Schalter weist den Compiler an,
nur die Assemblerdatei zu erzeugen. Damit ist der Schalter gerade für
einen Anfänger weniger wichtig. Wer aber etwas Assembler beherrscht, kann
einmal seine Neugierde befriedigen.
- -P
- Dieser Schalter weist den Compiler an, nur den Preprozessor zu starten.
Dies kann manchmal recht nützlich sein, wenn ein Makro nicht das tut,
was es soll. Die Ausgabedatei hat .i als Extension.
- -o <file>
- Dieser Schalter setzt den Namen des Outputfiles auf <file>. Dies ist
wichtig für den Linkvorgang, da der Linker sonst den Namen a.out benutzt.
- -f
- Mit diesem Schalter weist man den Linker an, Bibliotheken mit
Fließkommaroutinen zu linken. Ohne diesen Schalter versucht der Linker,
die Standardbibliothek ohne Fließkommaunterstützung zu verwenden.
- -F <file>
- Mit diesem Schalter weist man den Linker an, aus der Datei file die
Objektdateien und die Bibliotheken zu ermitteln, die er zusammenlinken
soll. Der Aufbau dieser Datei ist in der Dokumentation beschrieben. Wenn
ein Projekt aus mehreren Dateien besteht, ist diese Option ist eine
Möglichkeit, alle Dateien dem Linker anzugeben.
- -l <name>
- Mit diesem Schalter weist man den Linker an, eine Bibliothek mit dem
Dateinamen 'lib<name>.a' oder '<name>.a' zu dem Programm zu linken.
- -L<path>
- Mit diesem Schalter gibt man dem Linker einen weiteren Pfad bekannt, den
er nach den Bibliotheken durchsucht, die er zulinken möchte.
- -I<path>
- Mit diesem Schalter gibt man dem Preprozessor einen weiteren Pfad
bekannt, den er für die include-Anweisung nach Headerdateien durchsucht.
- -D<sym>
- Mit diesem Schalter definiert man für den Preprozessor das Symbol sym
mit dem Wert 1. Dies ist z.B. nützlich, um für die auszuliefernde
Version des Programms NDEBUG zu definieren und damit das Makro assert
auszublenden.
- -D<sym=val>
- Dieser Schalter ist gleichbedeutend mit der Preprozessoranweisung
#define sym val
- -W<n>
- Dieser Schalter setzt die Anzahl Fehler oder Warnungen, nach der der
Compiler seine Arbeit abbricht.
GCC-Compilerschalter
Auch bei den Schaltern für GCC handelt es sich um Kommandozeilenparameter.
Das Verhalten von GCC lässt sich hier im Vergleich zu TC/PC oder auch Sozobon
sehr fein steuern, so dass hier nur eine kleine Auswahl vorgestellt werden
kann.
- -c
- Dieser Schalter weist den Compiler an, die Datei nur zu compilieren und
den Linker nicht aufzurufen. Das daraus resultierende Objektfile hat
den gleichen Namen wie die Quelldatei, aber mit .o als Extension.
Dieser Schalter wird benötigt, wenn ein Programm aus mehr als einer
Datei besteht. Dann muss jede Datei nur übersetzt und sämtliche
Objektdateien zum Programm zusammengelinkt werden.
- -S
- GCC übersetzt eine Quelldatei zu einer Objektdatei in zwei Schritten.
Im ersten Schritt wird eine Assemblerdatei erzeugt, die anschließend von
einem Assembler übersetzt wird. Dieser Schalter weist den Compiler an,
nur die Assemblerdatei zu erzeugen. Damit ist der Schalter gerade für
einen Anfänger weniger wichtig. Wer aber etwas Assembler beherrscht, kann
einmal seine Neugierde befriedigen.
- -E
- Dieser Schalter weist den Compiler an, nur den Preprozessor zu starten.
Dies kann manchmal recht nützlich sein, wenn ein Makro nicht das tut,
was es soll. Die Ausgabe wird auf die Standardausgabe, also auf den
Monitor ausgegeben und kann mittels Ausgabeumlenkung in eine Datei
geschrieben werden.
- -o <file>
- Dieser Schalter setzt den Namen des Outputfiles auf <file>. Dies ist
wichtig für den Linkvorgang, da der Linker sonst den Namen a.out benutzt.
- -funsigned-char
- Diese Option setzt den Standard-Datentyp für char auf unsigned. Achtung:
wenn mittels dieser Option zwischen signed und unsigned char umgeschaltet
wird, sind die Programme nicht mehr portabel!
- -D<sym>
- Mit diesem Schalter definiert man für den Preprozessor das Symbol sym
mit dem Wert 1. Dies ist z.B. nützlich, um für die auszuliefernde
Version des Programms NDEBUG zu definieren und damit das Makro assert
auszublenden.
- -D<macro=defn>
- Dieser Schalter ist gleichbedeutend mit der Preprozessoranweisung
#define sym val
- -l<library>
- Mit diesem Schalter weist man den Linker an, eine Bibliothek mit dem
Dateinamen 'lib<name>.a' zu dem Programm zu linken.
- -I<dir>
- Mit diesem Schalter gibt man dem Preprozessor einen weiteren Pfad
bekannt, den er für die include-Anweisung nach Headerdateien durchsucht.
- -L<dir>
- Mit diesem Schalter gibt man dem Linker einen weiteren Pfad bekannt, den
er nach den Bibliotheken durchsucht, die er zulinken möchte.
- -pedantic
- Mit diesem Schalter weist man den Compiler an, sich bei der Überprüfung
strikt an den ANSI-Standard zu halten.
- -pedantic-errors
- Dieser Schalter arbeitet wie -pedantic, führt aber immer zu einem Error,
wenn ansonsten nur eine Warnung erscheinen würde.
- -W...
- Diverse Varianten von -W schalten zusätzliche Überprüfungen ein und
erzeugen eine Warnung, wenn der Test nicht zutrifft. Hier sollte man
nicht sparsam sein, da einige der Warnungen auch auf einen Fehler im
Programm hinweisen können. Welche Varianten es gibt, kann der Anleitung
zu GCC bzw. der manual page entnommen werden. Die einfachste Möglichkeit
ist es, -Wall für sämtliche Warnungen zu setzen.
- -mc68020
- Dieser Schalter weist den Compiler an, Code für einen 68020-Prozessor
oder größer zu erzeugen. Dies ist die Grundeinstellung, wenn der GCC aus
den Originalsourcen erstellt wird. Es sollte aber normalerweise keinen
Grund geben, die älteren Ataris (1040, Mega ST, ...) auszusperren, da
diese Optimierung nur einen geringen Vorteil bietet.
- -mc68000
- Dieser Schalter weist den Compiler an, Code zu generieren, der auch auf
Computer mit 68000-CPU läuft.
- -m68881
- Dieser Schalter weist den Compiler an, Code für den 68881-Coprozessor zu
erzeugen. Damit läuft das Programm nur noch auf Ataris mit FPU. Wenn
ein Programm intensiv Fließkommaberechnung benutzen muss, ist diese
Optimierung sinnvoll.
- -mshort
- Dieser Schalter weist den Compiler an, einen int als 16-bit-Wert zu
betrachten.
Michael Bernstein |