6 Управление строками
Препроцессор C сообщает компилятору C о местоположении в исходном коде, откуда происходит каждый токен. В настоящее время это просто имя файла и номер строки. Все токены, полученные в результате макроподстановки, сообщаются как появившиеся на строке исходного файла, где был использован внешний макрос. Мы намерены сделать это точнее в будущем.
Если вы пишете программу, которая генерирует исходный код, например, генератор парсеров bison, вы можете вручную настроить представление препроцессором текущего имени файла и номера строки. Части вывода bison генерируются с нуля, другие части берутся из стандартного файла парсера. Остальные скопированы дословно из входных данных bison. Вы хотите, чтобы сообщения об ошибках компилятора и символьные отладчики могли ссылаться на входной файл bison.
bison или любая подобная программа может организовать это, написав директивы «#line» в выходной файл. «#line» — это директива, которая указывает исходный номер строки и имя исходного файла для последующего ввода в текущем файле входных данных препроцессора. У «#line» есть три варианта:
#line linenum-
linenum — это целочисленная константа с положительным или нулевым десятичным значением. Она указывает номер строки, который должен быть сообщен для следующей строки ввода. Последующие строки считаются с linenum.
#line linenum filename-
linenum такой же, как в первом формате, и имеет тот же эффект. Кроме того, filename — это строковая константа. Следующая строка и все последующие строки сообщаются как взятые из указанного файла, пока что-то не изменит это. filename интерпретируется в соответствии с обычными правилами для строковой константы: обратные слэши интерпретируются. Это отличается от «#include».
#line anything elseanything else проверяется на наличие макровызовов, которые расширяются. Результат должен соответствовать одному из двух вышеперечисленных форматов.
Директивы «#line» изменяют результаты предопределенных макросов __FILE__ и __LINE__ с этого момента. См. Стандартные предопределенные макросы. Они не оказывают никакого влияния на представление директивы «#include» о каталоге, содержащем текущий файл.
Далее: Директивы, Предыдущее: Диагностика, Вверх: Главная [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/cpp/Line-Control.html