#line-Direktive

Die #line-Direktive beeinflusst die vordefinierten Konstanten __LINE__ und __FILE__. Normalerweise geben diese Konstanten an, an welcher Zeile und in welcher Datei sich der Compiler gerade befindet. Mit der #line-Direktive können diese Werte explizit geändert werden. Da jedoch manipulierte Zeilen- und Dateiangaben die Fehlersuche erheblich erschweren können, wird vom experimentellen Gebrauch der #line-Direktive im Allgemeinen ABGERATEN.




Line: 4, File: test.cpp

Line: 99, File: wurst.h
#include <stdio.h>

int main(){
  printf("Line: %d, File: %s\n", __LINE__, __FILE__);
  #line 99 "wurst.h"
  printf("Line: %d, File: %s\n", __LINE__, __FILE__);
  return 0;
}

Details

Der Dateiname wird als vollständiger Pfad ausgegeben. Er wurde hier jedoch auf den Dateinamen gekürzt, der Übersichtlichkeit wegen.

Der Sinn dieser Direktive liegt darin Hinweise zu geben, welche Datei konsultiert werden soll. Dies ist besonders dann der Fall, wenn veraltete Dateien eingebunden werden, die auf neue Dateien verweisen. Die Verwendung der #line-Direktive wird jedoch hinfällig aufgrund der guten Dokumentation von APIs, sowie der verbesserten Intelligenz heutiger Compiler, welche meistens imstande sind, die korrekten Stellen aufzufinden.

Für die Zeilennummer können auch Makros angegeben werden:



123
#define LINENUM 123
#line LINENUM
printf("Line: %d\n", __LINE__);

Um dem Preprozessor somit beizubringen, nur die __FILE__-Konstante zu ändern, wird einfach folgendes Konstrukt benutzt:


Line: 124, File: gaga.h
#line __LINE__ "gaga.h"
printf("Line: %d, File: %s\n", __LINE__, __FILE__);

Die Zeilennummern zählen nach dem Auftreten der #line-Direktive schrittweise ab der angegebenen Zeile weiter:


99
100
#line 99
printf("Line: %d\n", __LINE__);
printf("Line: %d\n", __LINE__);