Директива #line (C/C++)
Директива #line сообщает препроцессору, чтобы задать сообщаемые значения компилятора для номера строки и имени файла заданному номеру строки и имени файла.
Синтаксис
#line
digit-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__ );}