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

#linedigit-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 została 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__ );}

Zobacz też

Dyrektywy preprocesora