Spec-Zone.ru › GCC 7 CPP

6 Управление строками

Препроцессор C сообщает компилятору C о местоположении в вашем исходном коде, откуда происходит каждый токен. В настоящее время это просто имя файла и номер строки. Все токены, полученные в результате расширения макросов, сообщаются как появившиеся в строке исходного файла, где был использован внешний макрос. В будущем мы планируем повысить точность.

Если вы пишете программу, которая генерирует исходный код, например, генератор парсеров bison, вы можете вручную скорректировать представление препроцессора текущего имени файла и номера строки. Части вывода из bison генерируются с нуля, другие части берутся из стандартного файла парсера. Остальные скопированы дословно из входных данных bison. Вы хотели бы, чтобы сообщения об ошибках компилятора и символьные отладчики могли ссылаться на входной файл bison.

bison или любая такая программа может организовать это, написав директивы «#line» в выходной файл. «#line» — это директива, которая указывает исходный номер строки и имя исходного файла для последующего ввода в текущем файле ввода препроцессора. «#line» имеет три варианта:

#line linenum

linenum — это целое десятичное число без знака. Оно указывает номер строки, который должен быть показан для следующей строки ввода. Последующие строки считаются начиная с linenum.

#line linenum filename

linenum — такой же, как и в первом варианте, и имеет тот же эффект. Кроме того, filename — это строковая константа. Следующая строка и все последующие строки сообщаются как происходящие из указанного файла, пока что-либо не изменит это. filename интерпретируется по обычным правилам для строковой константы: обратные слэши интерпретируются. Это отличается от «#include».

#line anything else

anything else проверяется на наличие вызовов макросов, которые расширяются. Результат должен соответствовать одному из двух вышеперечисленных вариантов.

Директивы «#line» изменяют результаты предопределенных макросов __FILE__ и __LINE__ начиная с этого момента. См. Стандартные предопределенные макросы. Они не оказывают никакого влияния на представление «#include» каталога, содержащего текущий файл.

Далее: Директивы, Предыдущее: Диагностика, Вернуться вверх: Наверх [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/cpp/Line-Control.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API