Namensräume
Varianten
Aktionen

Dateiname und Zeileninformationen

Von cppreference.com

Ändert die aktuelle Zeilennummer und den Dateinamen im Präprozessor.

Inhalt

[bearbeiten] Syntax

#line lineno (1)
#line lineno "filename" (2)

[bearbeiten] Erklärung

1) Ändert die aktuelle Präprozessor-Zeilennummer zu lineno. Vorkommen des Makros __LINE__ über diesen Punkt hinaus werden zu lineno plus der Anzahl der seitdem aufgetretenen tatsächlichen Quellcodezeilen expandieren.
2) Ändert auch den aktuellen Präprozessor-Dateinamen zu filename. Vorkommen des Makros __FILE__ über diesen Punkt hinaus werden filename erzeugen.

Jede Präprozessor-Token (Makrokonstanten oder -ausdrücke) sind als Argumente für #line zulässig, solange sie zu einer gültigen Dezimalzahl expandieren, der optional ein gültiger Zeichenstring folgt.

lineno muss eine Sequenz von mindestens einer Dezimalziffer sein (andernfalls ist das Programm fehlerhaft) und wird immer als Dezimalzahl interpretiert (auch wenn sie mit 0 beginnt).

Wenn lineno 0 ist oder größer als 32767(bis C99)2147483647(seit C99), ist das Verhalten undefiniert.

[bearbeiten] Anmerkungen

Diese Direktive wird von einigen automatischen Codegenerierungswerkzeugen verwendet, die C-Quelldateien aus einer Datei in einer anderen Sprache erzeugen. In diesem Fall können #line-Direktiven in die generierte C-Datei eingefügt werden, die auf Zeilennummern und den Dateinamen der ursprünglichen (menschenlesbaren) Quelldatei verweisen.

Die Zeilennummer, die der Direktive #line __LINE__ folgt, ist nicht spezifiziert (es gibt zwei mögliche Werte, zu denen __LINE__ in diesem Fall expandieren kann: die bisher gesehene Anzahl von Zeilenumbrüchen oder die bisher gesehene Anzahl von Zeilenumbrüchen plus der Zeilenumbruch, der die #line-Direktive abschließt). Dies ist das Ergebnis von DR 464, die rückwirkend gilt.

[bearbeiten] Beispiel

#include <assert.h>
#define FNAME "test.c"
int main(void)
{
#line 777 FNAME
        assert(2+2 == 5);
}

Mögliche Ausgabe

test: test.c:777: int main(): Assertion `2+2 == 5' failed.

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 6.10.4 Zeilensteuerung (S. 126)
  • J.1 Undefiniertes Verhalten
  • C11-Standard (ISO/IEC 9899:2011)
  • 6.10.4 Zeilensteuerung (S. 173)
  • C99-Standard (ISO/IEC 9899:1999)
  • 6.10.4 Zeilensteuerung (S. 158)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 3.8.4 Zeilensteuerung

[bearbeiten] Siehe auch

C++-Dokumentation für Datum- und Zeileninformationen