10.4 Vordefinierte Präprozessor-Direktiven (ANSI C) 

Folgende vordefinierten Makros werden von ANSI C vorgeschrieben:
Makroname | Bedeutung |
__LINE__ |
die Zeilennummer der aktuellen Zeile in der Programmdatei |
__FILE__ |
der Name der Programmdatei |
__DATE__ |
das Übersetzungsdatum der Programmdatei |
__TIME__ |
die Übersetzungszeit der Programmdatei |
__STDC__ |
das Erkennungsmerkmal eines ANSI-C-Compilers. Ist die ganzzahlige Konstante auf den Wert 1 gesetzt, handelt es sich um einen ANSI-C-konformen Compiler. |
__cplusplus |
C++-Code |
Hier sehen Sie ein Beispiel zur Verwendung dieser vordefinierten Makros:
/* direktiven.c */ #include <stdio.h> #include <stdlib.h> #if defined __STDC__ #define isstd_c() printf("ANSI-C-Compiler\n") #else #define isstd_c() printf("Kein ANSI-C-Compiler\n") #endif int main(void) { printf("Zeile %d in Datei %s\n",__LINE__,__FILE__); printf("Übersetzt am %s um %s\n",__DATE__,__TIME__); #line 999 "asdf.c" printf("Zeile %d in Datei %s\n",__LINE__,__FILE__); isstd_c(); /* Ist es ein ANSI-C-Compiler ? */ return EXIT_SUCCESS; }
Im Programm wurde gleich eine weitere neue Präprozessor-Direktive eingesetzt:
#line Zeilennummer dateinamen.c
Damit wird bewirkt, dass die nächste Zeile der Datei dateiname.c mit der Zeile Zeilennummer (also 999) beginnt. Diese Präprozessor-Direktive beeinflusst das Programm selbst nicht, sondern nur die Nummerierung der einzelnen Zeilen. Sie wird verwendet, um einem Programm Zeilennummern für Querverweise oder Fehlermeldungen zu übergeben. Diese Direktive wird vorwiegend von Programmen wie lex oder yacc verwendet, die C-Quelltexte erzeugen.
Außer den vordefinierten Makros (wie __LINE__, __FILE__, __DATE__, __TIME__ und __STDC__) sind im C99-Standard weitere drei Makros hinzugekommen (siehe Tabelle 10.6).
Makro | Bedeutung |
__func__ |
Gibt den Namen der Funktion aus, in der dieses Makro verwendet wird. |
__STD_HOSTED__ |
Wenn es sich um eine Hosted-Implementierung der Standardbibliothek handelt, ist diese Konstante 1, ansonsten 0. |
__STD_VERSION__ |
Wenn der ANSI-C99-Standard unterstützt wird, ist diese Konstante 199901L (1999 Januar). |
Einen Präprozessortest auf C99-Kompatibilität können Sie somit wie folgt durchführen:
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99-kompatibler Quellcode. #else // nicht C99-kompatibler Quellcode #endif
Hier sehen Sie ein weiteres Beispiel mit dem Makro __func__, das sich prima zum Debuggen von Programmen eignet:
/* stdmakro.c */ #include <stdio.h> #include <stdlib.h> void eine_funktion(void) { printf("Name der Funktion: %s\n",__func__); } int main(void) { eine_funktion(); return EXIT_SUCCESS; }
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.