Директива #line указывает, что препроцессор изменяет количество и имя файла линии компилятора внутренне, хранящихся в заданное число и имени файла линии.
#line digit-sequence ["filename"]
Компилятор использует номер линии и имя необязательного файла для обращения к ошибкам, он ищет во время компиляции. Номер линии обычно ссылается на текущую линию ввода и имя файла относится к текущему входному файлу. Номер линии увеличивается после того как каждая линия обрабатывается.
Значение числ-последовательность может быть любой константы целого числа. Замену макроса могут быть выполнены в токенах предварительной обработки, но результат должен иметь правильный синтаксис. FileName может иметь любую комбинацию символов и должен заключаться в двойные кавычки (" "). Если FileName опущен, то предыдущее имя файла остается неизменным.
Можно изменить количество линий и имя файла источника путем написания #line директивы. Транслятор использует номер линии и имя файла для определения значения предопределенных макросов __FILE__ и __LINE. Можно использовать эти макросы для вставки своих сообщений об ошибке в тексте программы.
Если изменить число и имя файла линии, то компилятор не учитывает предыдущие значения и продолжает обработку с новыми значениями. #line директива обычно используется генераторами программы, чтобы вызвать сообщения об ошибке исходного файла, а не к создаваемой программе.
Следующие примеры иллюстрируют #line и __LINE и __FILE__ макросы.
В директиве номер линии имеет значение 151, а имя файла изменено на copy.c.
#line 151 "copy.c"
В этом примере макрос ASSERT использует предварительно определенные макросы __LINE и __FILE__ для написания сообщения об ошибке о файле источника, если заданное "проверочное утверждение" не имеет значение true.
#define ASSERT(cond)
if(!(cond))
{
printf("assertion error line %d, file(%s)\n", __LINE__, __FILE__ );
}