#line — dyrektywa (C/C++)
Dyrektywa #line mówi preprocesorowi, żeby zmienił wewnętrznie przechowywany przez kompilator numer wiersza oraz nazwę pliku na podany numer wiersza i nazwę pliku.
#line digit-sequence ["filename"]
Uwagi
Kompilator używa numeru wiersza i (opcjonalnie) nazwy pliku, aby odwoływać się do błędów, które znajdzie podczas kompilacji.Zazwyczaj numer wiersza odwołuje się do bieżącego wiersza wejściowego, a nazwa pliku do bieżącego pliku wejściowego.Numer wiersza jest zwiększany po przetworzeniu każdego wiersza.
Wartość sekwencji cyfrowej może być dowolną stałą liczbą całkowitą.Makro zamiana może zostać wykonana na tokenach wstępnego przetwarzania, ale wynik musi zostać oszacowany do poprawnej składni.Nazwa pliku może być dowolną kombinacją znaków, ale musi zostać ujęta w podwójne znaki cudzysłowu (" ").Jeśli nazwa pliku zostanie pominięta, poprzednia nazwa pliku pozostanie niezmieniona.
Możesz zmienić numer wiersza źródła i nazwa pliku, pisząc dyrektywę #line.Translator używa numeru wiersza i nazwy pliku, aby określić wartości predefiniowanych makr __FILE__ i __LINE__.Możesz użyć tych makr, aby wstawić samoopisowe komunikaty o błędzie do tekstu programu.Aby uzyskać więcej informacji dotyczących wstępnie zdefiniowanych makr, zobacz Wstępnie zdefiniowane makra.
Makro __FILE__ rozwija się na ciąg, którego zawartością jest nazwa pliku otoczona przez podwójne znaki cudzysłowu (" ").
Jeśli zmienisz numer wiersza i nazwę pliku, kompilator zignoruje poprzednie wartości i będzie kontynuował przetwarzanie z nowymi wartościami.Dyrektywa #line jest zwykle używana przez generatory programu, aby spowodować, że komunikaty o błędach odnoszą się do oryginalnego pliku źródłowego zamiast do wygenerowanego programu.
Poniższe przykłady ilustrują użycie makr #line, __LINE__ i __FILE__.
W tej instrukcji, wewnętrznie przechowywany numer wiersza został ustawiony na 151, a nazwa pliku została zmieniona na copy.c.
#line 151 "copy.c"
W tym przykładzie, makro ASSERT używa wstępnie zdefiniowanych makr __LINE__ i __FILE__, aby wydrukować komunikat o błędzie dotyczący pliku źródłowego, jeśli dana instrukcja asercji nie jest prawdziwa.
#define ASSERT(cond)
if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}