Директива #line служит для задания программе способа нумерации строк, используемой при создании перекрестных ссылок и при выдаче сообщений об ошибках. Если программа состоит из разделов, взятых из разных программных файлов, часто бывает полезно обозначить такие разделы номерами строк, взятыми из соответствующего исходного текста, а не обычными последовательными номерами строк составной программы. Синтаксис директивы следующий:
#line номер_строки <"имя-файла">
и обозначает, что данная строка имеет номер строки из файла, заданного "именем-файла". После того, как имя-файла было задано, все последующие команды #line, относящиеся к данному файлу, могут опустить явный аргумент имя-файла. Синтаксис директивы #line следующий:
#line константа["имя-файла"] // Содержимое скобок [ ] можно опустить
Директива #line дает команду компилятору сменить хранимые им номер строки и имя файла на данные. Компилятор использует номер строки и имя файла для указания ошибок, которые он обнаруживает при компиляции. Номер строки обычно соответствует текущей строке, а имя файла – текущему файлу. После обработки каждой строки номер строки увеличивается.
Если сменить номер строки и имя файла, то компилятор игнорирует предыдущие значения и продолжит обработку с новыми значениями. Директива #line обычно используется генераторами программ для появления сообщений об ошибках в исходном тексте, а не в генерируемой программе.
Константа в директиве #line может быть любой целой константой. Имя файла может быть любой комбинацией символов, заключенной в двойные кавычки. Если имя файла не задано, то предыдущее имя файла остается без изменения.
Всегда имеется доступ к текущему номеру строки и имени файла через заранее определенные идентификаторы __LINE__ и __FILE__. Эти идентификаторы можно использовать в самодокументирующихся сообщения об ошибках, помещенных в текст программы.
Идентификатор __FILE__ раскрывается в строку, содержимое которой есть имя файла, заключенное в двойные кавычки. Например,
#line 151 "copy.c" – номером строки является 151, а имя файла – copy.c;
#define ASSERT(cond) if(!cond)
{printf("assertion error line %d, file(%s)n",
__LINE__, __FILE__ );} else …
Макро ASSERT использует ранее определенные идентификаторы __LINE__ и __FILE__ для печати сообщения об ошибке в исходном файле, если значение условия "ложь".