11.5  Директива управления нумерацией строк #line

Директива #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__ для печати сообщения об ошибке в исходном файле, если значение условия "ложь".