5. Programmierumgebung
Ziele dieser Einheit:
- Schritte von der Erstellung des Programms zu seiner Ausführung (execution).
- Debuggen bzw. Verifikation des Programms und
Validation der Ergebnisse.
Pre- processor
Modifizierter Quell-Code Compiler
(Übersetzer) Verschieb-
barer Ob- jekt-Code
Lader
Ein- gaben
Quell- Code (Source)
Ergeb- nisse Binder
(Linker)
Ausführba- rer (Absolut-) Objekt-Code andere
Objekt-Codes;
Bibl.-funkt- ionen;
Startcode
Editor
(„edieren“)
meinprogramm.c
meinprogramm.exe („compilieren“)
C-Compiler Quell-
Code Fehler-
frei?
J
ausführen Erfolg-
reich
?
Binder/Lader N
Korrigieren
(„debuggen“)
N
(„verifizieren/validieren“)
Ausführung unseres ersten C-Programms
#include <stdio.h> /*Standard Ein-/Ausgabe*/
/* Hauptprogramm */
void main() /* void: kein Ergebnis-DT*/
{ /* Beginn */
/* Ausgabe von Hallo, Welt! */
printf("Hallo, Welt! \n");
/* „printf“ : Funktion „formatted print“ */
/* „\n“ : „escape sequence“ - newline */
} /* Ende */
Der Präprozessor kann wie folgt benutzt werden:
1. Einfügen von Quelltextdateien und Bibliotheken. Zweierlei Bedeutung:
#include <<Dateiname>> , z.B. #include <myFile.h>, bedeutet Ansprechen von Standardfunktionen, welche meist in den Verzeichnissen
/usr/include oder /usr/local/include/ stehen.
oder
#include "<Dateiname>", z.B. #include "myFile.h",
bedeutet Einfügen von benutzerdefinierten Dateien. Die Suche erfolgt in der lokalen Umgebung (aktuelles Verzeichnis).
Bemerkung: Achten Sie auf die Benutzung von „<...>“ bei Nicht-Terminalen.
2. Makrodefinition und -ersetzung.
#define <Makroname> <Ersatztext>
Abkürzung häufig benutzter Zeichenfolgen.
Makrodefinition: #define SQUARE(X) X*X Makroaufruf (Bsp.): b=SQUARE(a+1)
erzeugter Code: b=a+1*a+1
Richtig: #define SQUARE(X) ((X)*(X))
3. Zur Steuerung der bedingten Übersetzung.
Präprozessor-Direktiven zur Festlegung zu übersetzender Programmteile:
#if def_1
Programm_A
#elif def_2
Programm_B
…
#else def_9
Programm_Z
Übersetzung, wenn der Makroname bekannt ist:
#ifdef Makroname