Das ATOS-Magazin
 
  zurück zum News-Archiv
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


Anfang zurück vorwärts Ende Seitenanfang

Copyright und alle Rechte beim ATOS-Magazin. Nachdruck und Veröffentlichung von Inhalten nur mit schriftlicher Zustimmung der Redaktion.
Impressum - Rückmeldung via Mail oder Formular - Nachricht an webmaster