ein Kapitel zurück                                           ein Kapitel weiter

Der Ergänzung halber wegen will ich noch die restlichen Preprozessordirektiven erklären. Sie sind aber für den Verlauf des Kurses nicht wichtig. Zuerst will ich noch von ANSI-C vorgeschriebene Makronamen nennen....

Makronamen Bedeutung
__LINE__ Zeilennummer in der Programmdatei
__FILE__ Name der Programmdatei
__DATE__ Übersetzungsdatum der Programmdatei
__TIME__ Übersetzungszeit der Programmdatei
__STDC__ Erkennungsmerkmal eines ANSI-C Compilers. Ist die ganz zahlige Konstante auf den Wert 1 gesetzt ist es ein ANSI-C Compiler


Nun zu einem Beispiel das all diese vordefinierten Makronamen einsetzt.......

/*Download:line.c*/
#include <stdio.h>

int main()
{
printf("Zeile %d in Datei %s\n",__LINE__,__FILE__);
printf("Datei wurde am %s um %s übersetzt!\n",__DATE__,__TIME__);

#line 999 "asdf.c"
printf("Jetzt die Zeile %d in Datei %s\n",__LINE__,__FILE__);

return 0;
}

Im Programm habe ich gleich die nächste Präprozessordirektive....

#line zeilennummer dateinamen.c

...die bewirkt das die nächste Zeile der Datei 'dateiname.c' mit der Zeile 'zeilennummer' beginnt. Diese Präprocessordirektive beeinflußt das Programm selbst nicht, sondern nur die Nummerierung der einzelnen Zeilen selbst.

Ersetzung von Makroparametern durch einen String
Ist in einem Ersetzungstext vor dem Parameter das Zeichen # gesetzt wird beim Aufruf des Makros das # und der Parameter durch den entsprechenden String ersetzt.......

#define ausgabe(variable) printf(#variable" = %d\n",variable)

Wir übergeben jetzt der Variable 'int Zahl' den Wert 10 (int Zahl=10;) Im Programm steht jetzt....

ausgabe(Zahl)

Dies wandelt unser Präprozessor zunächst um in.....

printf("Zahl"" = %d\n",Zahl);

Was nach einer Stringkontenation folgendermaßen aussieht......

printf("Zahl = %d\n");

Hier nun ein kleines Programmbeispiel wie wir das einsetzten können....

/*Download:mypara.c*/
#include <stdio.h>
#include <math.h>

#define wurzel(zahl) printf(#zahl" von %f = %f\n",zahl,sqrt(zahl))
#define summe(zahl1,zahl2) printf(#zahl1 "+" #zahl2 " = %d\n",zahl1+zahl2)
#define gibaus(string) printf(#string"\n")
#define wertvon(zahl,format) printf(#zahl" = "format"\n",zahl)

int main()
{
float Wurzel;
int Wert1=100;
int Wert2=150;

char character='s';
int integer=20;
float floating=5.550;

printf("Zahl eingeben : ");
scanf("%f",&Wurzel);

wurzel(Wurzel);
summe(Wert1,Wert2);
gibaus(Hallo Welt);

wertvon(character,"%c");
wertvon(integer,"%d");
wertvon(floating,"%f");

return 0;
}

#undef - Makronamen wieder aufheben
Um ein Makro das sie mit #define definiert haben wieder aufzuheben brauchen sie nur im Programm.....

#undef makroname

..schreiben. Den eine Makrodefinition gilt von deren Festlegung (#define) bis zum Programmende ODER bis zur nächsten #undef-Direktive.

Ausgeben von Fehlermeldungen #error
Mit....

#error "Fehlermeldung"

....geben sie die 'Fehlermeldung' an der dementsprechenden Zeile aus. Beispiel....

/*Download:error.c*/
#include <stdio.h>

#define TEST

int main()
{
printf("Programmstart!\n");

#ifdef TEST
#error "Dies Programm ist noch nicht feritggestellt!!\n"
#endif

printf("Programmende");
return 0;
}

Wenn sie Versuchen nun das Programm zu compiliern wird es folgende Fehlermeldung auf dem Bildschirm ausgeben.......

Dies Programm ist noch nicht fertiggestellt!!

...dies ist nicht schlecht wenn man mit mehreren Leuten an einem Programm arbeitet und nicht aus versehen ein noch nicht ganz fertig aber funktionierendes Modul miteingebunden wird.

#pragma Pragma sind Compilerspezifische Direktiven und von Compiler zu Compiler verschieden. Wenn ein Compiler eine bestimmte #pragma - Direktive nicht kennt wird sie ignoriert. Da dies Systemabhängig ist will ich nicht näher darauf eingehen.

Wie gesagt dieses Kapitel dient nur zur Ergänzung der Präprozessordirektiven und richtet sich mehr an Fortgeschrittene User oder zum späteren Nachblättern bei Bedarf.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf