dyrektywa #line (C/C++)
Dyrektywa #line informuje preprocesor o ustawieniu zgłoszonych wartości kompilatora dla numeru wiersza i nazwy pliku na podany numer wiersza i nazwę pliku.
Składnia
#line
digit-sequence ["nazwa_pliku"]
Uwagi
Kompilator używa numeru wiersza i opcjonalnie nazwy pliku, aby odwoływać się do błędów znalezionych 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 cyfr może być dowolną stałą całkowitą w zakresie od 0 do 2147483647 włącznie. Zamiana makr może być używana w tokenach przetwarzania wstępnego, ale wynik musi zostać obliczony na poprawną składnię. Nazwa pliku może być dowolną kombinacją znaków i musi być ujęta w podwójny cudzysłów (" "
). Jeśli pominięto nazwę pliku , poprzednia nazwa pliku pozostaje niezmieniona.
Numer wiersza źródłowego i nazwa pliku można zmienić, pisząc dyrektywę #line
. Dyrektywa #line
ustawia wartość dla wiersza, który natychmiast następuje zgodnie z dyrektywą w pliku źródłowym. Translator używa numeru wiersza i nazwy pliku, aby określić wartości wstępnie zdefiniowanych __FILE__
makr i __LINE__
. Możesz użyć tych makr, aby wstawić samoopisowe komunikaty o błędzie do tekstu programu. Aby uzyskać więcej informacji na temat tych wstępnie zdefiniowanych makr, zobacz Wstępnie zdefiniowane makra.
Makro __FILE__
rozszerza ciąg, którego zawartość to nazwa pliku, otoczona podwójnym cudzysłowem (" "
).
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 programów. Służy on do powodowania komunikatów o błędach w celu odwoływania się do oryginalnego pliku źródłowego, a nie do wygenerowanego programu.
Przykład
Poniższe przykłady ilustrują #line
i __LINE__
makra i __FILE__
.
W pierwszym przykładzie numer wiersza jest ustawiony na 10, a następnie na 20, a nazwa pliku zostanie zmieniona na hello.cpp.
// line_directive.cpp
// Compile by using: cl /W4 /EHsc line_directive.cpp
#include <stdio.h>
int main()
{
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 10
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 20 "hello.cpp"
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
}
This code is on line 7, in file line_directive.cpp
This code is on line 10, in file line_directive.cpp
This code is on line 20, in file hello.cpp
This code is on line 21, in file hello.cpp
W tym przykładzie makro ASSERT
używa wstępnie zdefiniowanych __LINE__
makr i __FILE__
wyświetla komunikat o błędzie dotyczący pliku źródłowego, jeśli dana aseracja nie jest prawdziwa.
#define ASSERT(cond) if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}