Поделиться через


Директива #line (C/C++)

Директива #line сообщает препроцессору, чтобы задать сообщаемые значения компилятора для номера строки и имени файла заданному номеру строки и имени файла.

Синтаксис

#linedigit-sequence ["filename"]

Замечания

Номер строки и (необязательно) имя файла используется компилятором для указания на ошибки, которые он обнаруживает во время компиляции. Номер линии обычно указывает на текущую строку входных данных, а имя файла — на текущий входной файл. Номер строки увеличивается на единицу после обработки каждой строки.

Значение последовательности цифр может быть любой целочисленной константой в диапазоне от 0 до 2147483647 включительно. Для маркеров предварительной обработки можно использовать замену макросов, но результат должен оцениваться в правильном синтаксисе. Имя файла может быть любым сочетанием символов и должно быть заключено в двойные кавычки (" "). Если имя файла не указано, предыдущее имя файла остается неизменным.

Можно изменить номер исходной строки и имя файла, написав директиву #line . Директива #line задает значение строки, которая сразу же следует директиве в исходном файле. Переводчик использует номер строки и имя файла для определения значений предопределенных макросов __FILE__ и __LINE__. С помощью этих макросов можно вставлять в текст программы описательные сообщения об ошибках. Дополнительные сведения об этих предопределенных макросах см. в разделе предопределенные макросы.

Макрос __FILE__ расширяется на строку, содержимое которой — имя файла, окруженное двойными кавычками (" ").

Если изменить номер линии и имя файла, компилятор игнорирует предыдущих значений и продолжит обработку с новыми значениями. Директива #line обычно используется генераторами программ. Он используется для того, чтобы сообщения об ошибках ссылались на исходный файл, а не на созданную программу.

Пример

В следующих примерах показаны #line __LINE__ и __FILE__ макросы.

В первом примере номер строки имеет значение 10, а затем значение 20, а имя файла изменяется на 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

В этом примере макрос ASSERT использует предопределенные макросы __LINE__ и __FILE__ выводит сообщение об ошибке исходного файла, если данное утверждение не соответствует действительности.

#define ASSERT(cond) if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}

См. также

Директивы препроцессора