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


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

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

#line digit-sequence ["filename"]

Заметки

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

Значение параметра последовательность-цифр может представлять собой любую целочисленную константу. Над токенами предварительной обработки может выполняться замена макросов, однако полученный в этом случае результат должен иметь корректный синтаксис. Параметр имя-файла может представлять собой любую комбинацию символов и может быть окружен двойными кавычками (" "). Если имя-файла не задано, старое имя файла остается неизменным.

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

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

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

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

В этой инструкции устанавливается хранящийся в компиляторе внутренний номер строки 151, а имя файла меняется на copy.c.

#line 151 "copy.c"

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

#define ASSERT(cond)

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

См. также

Ссылки

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