Одна из основных задач С препроцессора - это передача информации компилятору о месторасположении различных частей программы.
Код программы может формироваться из нескольких исходных файлов при использовании директивы '#include'. Применение как директивы '#include', так и условий с макросами приводит к изменению основного исходного файла. Следует принимать во внимание значение нумерации строк С компилятором (при сообщениях об ошибках) и отладчиком (например, GDB).
В С препроцессоре существует директива, позволяющая контролировать эту возможность. Это может пригодиться в случае, если файлом ввода препроцессора является файл вывода другой программы, такой как 'bison', которая обрабатывает другой файл, являющийся основным исходным файлом. При подобной обработке нумерация строк теряется.
Для устранения этого недостатка используется директива '#line', которая позволяет указать номер строки реального исходного файла вместе с его именем. Директива '#line' применяется в трех модификациях:
Здесь LINENUM это десятичная целая константа, указывающая, что следующая строка является строкой исходного файла с номером LINENUM.
Здесь LINENUM это десятичная целая константа, а FILENAME - строковая константа, указывающая, что следующая строка является строкой исходного файла с именем FILENAME, а ее номер - LINENUM. Значение FILENAME должно быть заключено в двойные кавычки.
Значение ANYTHING ELSE проверяется на наличие макро вызовов, которые затем подставляются. Результатом должна быть десятичная целая константа, за которой может следовать стороковая константа, как это рассмотрено выше.
Вывод препроцессора (который затем перенапрвляется в компилятор) содержит директивы, подобные '#line', только они начинаются с символа '#', в отличие от '#line', за которыми следует номер строки и имя файла.